设计模式六种关系:依赖、关联、聚合、组合、继承和实现
在面向对象设计模式中,类与类之间主要有6种关系,他们分别是:依赖、关联、聚合、组合、继承、实现。他们的耦合度依次增强
依赖、关联、聚合和组合之间区别
• 依赖(Dependency) 关系是类与类之间的联接,一般而言,依赖关系体现为局域变量、方法的形参,或者对静态方法的调用。
• 关联(Association)关系是类与类之间的联接,它使一个类知道另一个类的属性和方法。关联可以是单向的,也可以是双向的。
• 聚合(Aggregation) 关系是关联关系的一种,是弱的关联关系。聚合是整体和个体之间的关系。比如乐队
(singer,guitarist,bassist,drumer)
• 组合(Composition) 关系是关联关系的一种,是强的关联关系。它要求普通的聚合关系中代表整体的对象负责代表部分对象的生命周期,组合关系是不能共享的。比如每名乐队成员(soul,body)
继承和实现的区别
继承:继承抽象类(当然也可承继普通类)
实现:实现接口,接口其实是抽象类的一种特殊形式。
• 继承(inherited):子类可继承抽象类或普通类,抽象类使用关键字abstract表示,JAVA和NET中子类只能继承一个基类,C++可以继承多个基类。
• 实现(implement):子类可以实现多个接口,接口使用关键字interface表示,接口中不允许有普通成员(也就是常量和变量),NET可以有属性、方法和事件,而JAVA只能有方法和事件,C++没有接口interface这个关键字,但可以用抽象类代替接口,里面都是纯虚函数。
注因为NET3.0中属性可以这样定义Name{ get; set; },就是不用和字段关联,所以在NET接口中可以定义属性,而JAVA中的属性getName和setName其实是方法,并不是真正的属性,需要和字段关联,所以在JAVA接口中不能定义属性。
而NET2.0中属性是这样定义的
private string name;
public string Name { get { return name; } set { name = value; } }
那么就不能在接口中定义属性。
JAVA中继承用关键字extends,实现用关键字implements,子类继承基类构造函数时,在子类中用关键字super传递依赖。
NET中继承和实现都用“:”,子类继承基类构造函数时,在子类中用关键字base传递依赖。
C++中继承用关键字”: :”表示
VB6.0中没用继承,虽然有一个关键字implements,但接口显然代替不了抽象类。
注VB中的类模块只是封装,比如Emploeye和Department这二个对象(Emploeye中有DepartmentID,这里是关联关系),就是说只提供对象的字段、属性、方法、事件相互之间的调用,这个只是OOP的初级功能,与继承扯不上边。所以VB只能算是基于对象的编程语言,或者说是不完全面向对象的。
Delphi7.0中有继承,使用关键字inherited表示,同时也有接口,用关键字interface表示。
TBass = class
procedure Proc(x,y: Integer); virtual;
function Fun(x,y: Integer): Integer; dynamic;
var
//variable declare
begin
end;
TChild = class(TBass)
procedure Proc(x,y: Integer); override;
function Fun(x,y: Integer): Integer; override;
var
//variable declare
begin
inherited;
//code……
end;
这里你看到了什么virtual,dynamic,override,说明delphi已经支持多态,这个才是OOP语言的标志,也就是完全面向对象。
虚方法注重调用速度的优化,动态方法注重代码大小的优化(占用内存空间较小),一个侧重速度、一个节约空间,一般经常需要子类代码覆盖的方法用虚方法,不经常的用动态方法 。
最后有读者可能会发现为什么Delphi和NET有些地方很像,其实delphi语言的前身turbo pascal编译器的设计师Anders Hejlsberg就是现在大名鼎鼎的.NET语言的首席设计师。
版权所有,转载请注明文章出处 http://blog/csdn.net/cadenzasolo