关于多重继承
LSP(Liscov Substutution Principle):子类对象拥有父类所有属性,可以当做父类对象来处理
多重继续引发的问题:
- 类关系复杂化(处理好优先级)
- 继承功能名字重复
Ruby的Mix-in:第二个父类开始的类要满足一下条件
- 不能单独生成实例的抽象类
- 不能继承Mix-in以外的类
解决名字重复:
- 给父类定义优先级:重复的时候使用优先级高的父类属性。Common Lisp Object System(CLOS)提供的功能在继承数据类型时很有效。
- 把重复的名字替换掉:Eiffel使用的就是这种方法,在模块继承时用这种方法很有效,其缺点就是写程序时很复杂。
- 指定使用类的名字:C++用的就是这种方法,这也是继承模块时有效的方法,缺点是本来不需要指定类名的情况现在却要指定。
Ruby中多重继承
举例:比较使用和不使用Mix-in的区别
这里的LockingMixin可以对任意的类提供lock功能,在这里,给Printer类增加了lock功能,在spool方法中调用了lock方法。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19moudle LockingMixin
def lock
…
end
def unlock
…
end
End
class Printer<Device
include LockingMixin
def spool(text)
lock
…
unlock
…
end
End
下面是没有Mix-in的程序,这里增加了实现lock功能的对象初始化,添加了Lock方法,还要定义很多方法的委托调用1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25class Lock
def lock
…
end
def unlock
…
end
end
Class Printer<Device
def initialize
@lock = lock.new
end
def lock
@lock.lock
end
def unlock
@lock.unlock
end
def spool(text)
@lock.lock
…
@lock.unlock
end
end
面向对象
面向对象的编程
- 数据抽象的研究
- 人工智能领域中的知识表现(框架模型)
- 仿真对象的管理方法(Simula)
- 并行计算模型(Actor)
- 结构化编程
面向对象编程是结构化编程的延伸。结构化编程基本上实现了控制流程的结构化,但是程序流程虽然结构化了,要处理的数据并没有被结构化。
面向对象的设计方法是在结构化编程对控制流程实现了结构化,又加上了对数据的结构化。
对象的模板-类
面向对象编程语言的共通:
- 不需要知道内部的详细处理就可以进行操作(封装,数据抽象)
- 根据不同的数据类型自动选择适当的方法(多态性)
大部分面向对象编程语言都有类和继承两个基本特性。类是对象的模板,通过类可以把同一类的对象管理起来。
抽象化
不用考虑内部处理的黑盒化(降低程序复杂度的有效方法)
利用模块的手段-继承
避免重复的方法就是继承
- 规格继承 从外部看到类的功能
- 实现继承 继承功能的实现方法