五千年(敝帚自珍)

主题:【原创】JAVA和C#,武当和少林之争! -- Highway

共:💬137 🌺299 🌵10
全看分页树展 · 主题 跟帖
家园 班门弄斧一下

这两个概念同managed code关系不大,基本上还是OO的概念。

delegate是指一个class object调用另一个class object的功能来提供自己的功能。本质上是Composition(或Containment,Layer)。

interface是指提供与parent class相同的接口。本质上是Public-Inheritance.

这就牵涉到OO的几个fundimental的观点。OO的基本教义派认为,

1)Public-Inheritance是严格的IS-A关系,也就是说如果两者是公共继承关系,derived class必须拥有parent class的所有特性。All or None, 要么继承所有接口和功能(derived class可以override parent class的virtual method),要么就不能继承。换言之,parent class必须是derived class的一个子集。

一个著名的例子就是,长方形(rectangle class)同正方形(square class)不存在Public-Inheritance关系,虽然数学上后者是前者的特殊情况,因为正方形(4边一样长)同长方形的长宽可以不一样长的特性矛盾,所以他们不是IS-A关系。

因此,Public-Inheritance是很严格的,按照Scott Meyers和Herb Sutter的说法,除非是严格的IS-A关系(而不是IS-ALMOST-A),不应该使用Public-Inheritance。

2)然而现实世界,具体编程的时候,往往大部分情况下,两个class object之间不存在这种IS-A关系,而常常是一个class需要用到另一个class的某些功能,或两个class拥有某些相同功能,一个class可以利用另一个class的相同功能来实现。这种情况下一般有两种方法,一种就是Composition,即HAS-A关系。一个class object包含另一个class object,通过调用被包含的那个object的功能来提供自己的功能,这种方法叫做delegate。另一种方法叫做Private-Inheritance。

3)除了Composition的HAS-A关系外,class object之间还有一种IS-IMPLEMENTED-IN-TERMS-OF关系,就是两个class的某些功能相同,你希望利用一个class现存的功能来完成另一个class的功能。这种关系当然可以通过Composition来实现,也可以通过Private-Inheritance来实现。一般而言,私有继承目的在于继承parent class的功能而不是Interface,所以很少需要override parent class的method(但不绝对)。

Composition同Private-inheritance本质上没有多大区别,都能够达到相同的目的,然而几乎所有的C++ experts都prefer composition to private-inheritance。具体原因这里就不细说了,请参阅Scott Meyers的Effective C++。一个重要原则是凡是能用Composition的地方绝不要用private-inheritance,除非是不得不如此(比方说你的derived class需要用到parent class的一些protected member)。

由此可见,在具体编程中,delegate(Composition)的使用频度大大超过interface(Public-Inheritance)。而在不存在严格IS-A关系的情况下,用Public-Inheritance来替代Compositon,本质上是violate the fundimental laws of OO Programming的,虽然从功能实现角度上讲毫无问题。

关键词(Tags): #Composition#Inheritance#OO元宝推荐:铁手,
全看分页树展 · 主题 跟帖


有趣有益,互惠互利;开阔视野,博采众长。
虚拟的网络,真实的人。天南地北客,相逢皆朋友

Copyright © cchere 西西河