多重继承--读松本行弘的程序世界
这个学期是简单的学习了基本的C++。感觉C++中最复杂的还是后面的多重继承和多态性。
多重继承有以下几个优点:
很自然地做到了单一继承的扩展;
可以继承多个类的功能;
虽然说多重继承的好处很明显,但是缺点也是相当明显的:
单一继承的时候,类之间的关系就是一条直线,很明白;
而到了多重继承的时候,类之间的关系就变成了一个网状图,类之间的关系图就变的很不明确了。
此外,多重继承让类关系复杂化,
还可能出现 继承功能名字重复的问题,(比如C++中的虚基类就是为了解决此类问题)
C++是允许多重继承的。JAVA虽然不允许多继承,但是有接口的概念,有了接口之后,以一种叫做 “规格的继承”(书上是这么写的,感觉意思不够明确),直白地说,虽然没有直接实现多重继承,但相当于间接地实现了多重继承,感觉有点像C++中的友元类。
Ruby中介绍了Mix-in模块来解决多重继承。
简单的说相当于把这些Mix-in模块看成是一个个可拆卸的模块,要用的时候拼接插入进去,解决了实现继承的问题。
举个Window的简单例子,看下面这张图片:
左边是普通的多继承的例子,而右边则是Mix-in版本的例子
把Titled 和Framed分别作为两个Mix-in模块,插入到所需的类里面去,既保证了单一继承的单纯性,也实现了多重继承的共有性。
还是给大家举个例子好了:
Ruby自己也没学多少东西,只好码点东西出来冲冲数:
[ruby]
class Person
attr_accessor :name, :age, :gender
def initialize (name)
@name = name
end
end
module 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
end
end
class Room
include UsefulFeatures
def current_person=(person)
#self.current.person = person
puts "set current person (use =)"
@current_person = person
end
end
if __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
自己每天没事写写博客...写这篇文章的主要目的就是提醒自己要有发散性思维,不要被一种编程语言所局限了。
编程语言其实和现实中的语言很类似,中国人学习外语,很容易被中国的思维所局限。所以像我们学习英语,很多时候是学习的不仅仅是语言本身,而是从语言中蕴含的文化,历史,最重要的是思想,考虑问题的方式。
举个简单的例子,英语中的祈使句:Could/Would you please......
或者是虚拟语气:If I were you......
类似于这样的例子,说明人家充分考虑别人的感受,是一种尊重他人的表现。
以此类推,我们把这种思想借鉴到编程语言当中来,就可以看出不同的编程语言之间的差异了。
当然自己也只能初步了解了解了,具体的东西还是得慢慢来看。
补充:软件开发 , C++ ,