2006年10月20日星期五

Ruby的特性之四,MIXIN

好久没写了,Ruby和Rails也很久没碰了,不过我还是想把一开始学习Ruby和Rails的感觉写完。今天就是最后一个特性,Mixin。
先说C++的多重继承,这个东西不论是从逻辑上还是从实际运用上都容易把人搞晕,所以后来Java和C#都取消了多重继承,换之以接口。但是接口有个缺点,就是,它只是接口,不包括具体实现,继承接口的类需要自己实现接口定义的各种方法,很多时候这些方法的实现是大同小异的,程序员不得不一次次重复自己,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

That's it!其实对于动态语言来说,实现这一点并不难,做到前面三点也不难,难的是Ruby把这些做的这么贴心,这么顺手,真难怪其异军突起。好了好了,我就不在这放马后炮了,希望各位have fun with it。下一篇我得讲讲shell编程了。

没有评论: