多重继承和面向对象

关于多重继承

  • 单一继承:继承的类被限定为一个
  • 多重继承:把单一继承自然地扩展,一个类可以继承多个类的功能。

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
19
moudle 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
25
class 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)
  • 结构化编程

面向对象编程是结构化编程的延伸。结构化编程基本上实现了控制流程的结构化,但是程序流程虽然结构化了,要处理的数据并没有被结构化。
面向对象的设计方法是在结构化编程对控制流程实现了结构化,又加上了对数据的结构化。

对象的模板-类

面向对象编程语言的共通:

  • 不需要知道内部的详细处理就可以进行操作(封装,数据抽象)
  • 根据不同的数据类型自动选择适当的方法(多态性)

大部分面向对象编程语言都有类和继承两个基本特性。类是对象的模板,通过类可以把同一类的对象管理起来。

抽象化

不用考虑内部处理的黑盒化(降低程序复杂度的有效方法)

利用模块的手段-继承

避免重复的方法就是继承

  • 规格继承 从外部看到类的功能
  • 实现继承 继承功能的实现方法