多重继承--读松本行弘的程序世界
这个学期是简单的学习了基本的C++。感觉C++中最复杂的还是后面的多重继承和多态性。
多重继承有以下几个优点:
很自然地做到了单一继承的扩展;
可以继承多个类的功能;
虽然说多重继承的好处很明显,但是缺点也是相当明显的:
单一继承的时候,类之间的关系就是一条直线,很明白;
而到了多重继承的时候,类之间的关系就变成了一个网状图,类之间的关系图就变的很不明确了。
此外,多重继承让类关系复杂化,
还可能出现 继承功能名字重复的问题,(比如C++中的虚基类就是为了解决此类问题)
C++是允许多重继承的。JAVA虽然不允许多继承,但是有接口的概念,有了接口之后,以一种叫做 “规格的继承”(书上是这么写的,感觉意思不够明确),直白地说,虽然没有直接实现多重继承,但相当于间接地实现了多重继承,感觉有点像C++中的友元类。
Ruby中介绍了Mix-in模块来解决多重继承。
简单的说相当于把这些Mix-in模块看成是一个个可拆卸的模块,要用的时候拼接插入进去,解决了实现继承的问题。
举个Window的简单例子,看下面这张图片:
class Person attr_accessor :name, :age, :gender def initialize (name) @name = name endendmodule UsefulFeatures def come_in(person) self.current_person = person #set_current_person(person) end def current_person #self.current+person @current_person end def set_current_person(person) puts "set current person" @current_person = person endendclass Room include UsefulFeatures def current_person=(person) #self.current.person = person puts "set current person (use =)" @current_person = person endendif __FILE__ == $0 jack = Person.new("jack") puts "name: #{jack.name}" bob = Person.new("bob") room = Room.new() room.come_in(jack) puts "room current person #{room.current_person.name}"end