主题:【原创】JAVA和C#,武当和少林之争! -- Highway
这两个概念同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的,虽然从功能实现角度上讲毫无问题。
- 相关回复 上下关系8
😁这里有个解释,你先看看: 3 Highway 字2282 2005-10-18 19:00:23
Thanks wooxiao 字0 2005-10-18 21:32:03
花!深入浅出。受教受教。 poorfat 字129 2005-10-17 23:35:41
班门弄斧一下
😁说得很不错,鲜花一朵。不过呢, 1 Highway 字426 2005-10-18 13:36:17
😜读完主贴的感觉是意犹未尽。哈哈,老大原来把尾巴藏这儿啦。 Koala 字354 2005-10-18 22:40:31
delegate只是一个shortcut而已 1 魔法胖子 字283 2005-10-18 16:46:20
几点浅见 1 无斋主人 字940 2005-10-18 14:20:42