蜻蜓
提示 登录 注册 提示 35063/0 09年7月6日 周一 6点16分 站标
正二品:特进|辅国大将军级别

认证会员
头像 积分:35153 乐善:292 声望:1576
离线/隐身 无斋主人 家园博客 发短信
注册于:2003-12-12 19:08:38
大类:[科技经济] → 版面:[信息技术]
2320/62 转发回复分页全看树展楼主帖 引用0 送花10收藏:0工具
o班门弄斧一下 [ 无斋主人 ] 于:2005-10-18 12:40:15
这两个概念同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): Inheritance OO Composition
2320/62/0 转发回复分页全看树展楼主帖 引用0 送花10收藏:0工具
引用(0) 请拷贝:
※※※ 相关(回复)帖 ※※※
O 昨天interview, 问我multiple inheritance (wooxiao;字168 阅2396
。。O 这里有个解释,你先看看: (Highway;字2282 阅2495 花2
。。。O Thanks (wooxiao;字0 阅1973
O 花!深入浅出。受教受教。 (poorfat;字129 阅1290
。。O 班门弄斧一下(无斋主人;字2376 阅2320 花1 O
。。。O 说得很不错,鲜花一朵。不过呢, (Highway;字426 阅2198
。。。。O 读完主贴的感觉是意犹未尽。哈哈,老大原来把尾巴藏这儿啦。 (Koala;字354 阅2113
。。。。O delegate只是一个shortcut而已 (魔法胖子;字283 阅2131
... 共 》62《跟帖
~~~◇—签 名 档—◇~~~

宠辱不惊,闲看庭前花开花落 去留无意,漫随天外云卷云舒
~~~————~~~
广告 购物分成,帮助网站

大厅。自动刷新完整聊
恭喜 趣味速拼 得宝
用户趣味游戏
天天天蓝成语
野草魂成语
testjhy成语
testjhy成语
豹子头成语
竹西佳处成语
一袋大米成语
豹子头成语
歇后语我要添加 更多
  • 秀才遇着兵--有理说不清() [孤帆]
  • 倒骑毛炉--往后瞧() [孤帆]
  • 十五个木桶打水--七上八下() [孤帆]
  • 八字不见一撇--没进展() [孤帆]
  • 外甥打灯笼--照旧(舅)(旧通舅) [孤帆]
  • 擀面杖吹火-一窍不通(旧通舅) [孤帆]
  • 丈二和尚--摸不着头脑() [孤帆]
  • 孔夫子搬家--尽输(书)() [孤帆]

Copyright © cchere 西西河 feed 西西河规 版主规范 帮西西河 帮助(FAQ) 版面介绍 发帖特殊效果 网站地图 关于西西河