2008-01-15

Ruby&Java比较之mixin

关键字: mixin
近日翻阅Rod Johnson的大作《J2EE Development without EJB》一书,在对AOP的阐述一章,看到如下内容。
AOP定义:
混入继承(mixin inheritance):一个“混入类”封装了一组功能,这组功能可以被“混入”到现有的类中,无须借助传统的继承。Java可以通过混入模拟多继承。混入通过“引介”实现。再看什么是“引介”。
引介(introduction):为一个现有的类或接口添加方法或字段。相当于对类的扩展。(把新功能介绍给现有类,多么形象!)

才接触java的mixin,一直以为mixin是ruby这类动态语言所特有的,看来是我错了,好东西谁都想拥有,没有可以借鉴别人的,只是不知道谁借鉴谁的。

说到mixin,不能不提接口,在"面向接口编程"被喊的铺天盖地的时候,mixin提供了更优雅的语言特性.

"面向接口编程"应该大力提倡,但接口的缺点也是众所周知,接口只是接口,没有具体实现,继承接口的类需要自己实现接口定义的各种方法,很多时候这些方法的实现是大同小异的,那就不得不一次次重复自己,repeat yourself已经是很痛苦的事情了,更不用说以后扩展维护的难度。

所以又出现了范型,generic programming。范型还不错,实现了数据类型无关的编程,这对很大一类问题都是很简单直接的解决办法,但是范型并没有很直接的解决继承接口无法继承实现的问题。并且,Ruby这样的动态语言本身就是数据类型无关的,并不需要范型这种东西,所以范型只是用来解救Java,C++,C#之类的.

Ruby提供的Mixin可以说是最直接的解决了接口继承的缺点。Mixin就是带有实现的接口。举个简单的例子吧。

module Mixin1
def fun1
print “I am fun1 from Mixin1″
end

def fun2
print “I am fun2 from Mixin1. I’ll call a member function of the class which includes me”
mem_fun
end

def fun3
print “I am fun3 from Mixin1. I’ll print out a member variable of the class which includes me”
print mem_var
end
end

class A
include Mixin1
def mem_fun
print “I am a member fun of class A”
end

def initialize
@mem_var =”I am a member varaible of class A
end
end

a = A.new
a.fun1
a.fun2
a.fun3

其实对于动态语言来说,实现这些并不难,难的是Ruby把这些做的这么贴心,这么顺手,难怪Ruby能日益流行。
评论
laozhijia 2008-01-16
System.out.println("Ruby");
发表评论

您还没有登录,请登录后发表评论

shaka
搜索本博客
存档
最新评论