[我能说服你们嘛?]关于面向对象的种种概念

healer_kx 2007-12-29 08:55:53
最近,看到许多人在讨论这方面的问题,我觉得有些朋友给的说法并不是我所认可的。所以我打算聊聊我的想法。当然了,我说的不一定对。
我打算用几种语言来说明这个问题,用我比较熟悉的语言,C/C++,Java,C#,Ruby。

1. 继承(C++中的public继承),通常表达is-a的类关系。
这个没有什么可以说的吧?

然后要说的就是C++支持多继承, Java不支持多继承.
这里要强烈抗议的就是大量的教科书在"Java不支持多继承, 但是支持多接口...", 这类的言词给许多Java的学习者造成了很大的误解, 多接口和多继承只是在语法形式上相似, 但是不具有更多的可比性。
Java的接口概念, C++用纯抽象类来表示.
class IEvent
{
public:
virtual void function() = 0;
};
这个和Java的
interface IEvent
{
void function();
}
是一致的.

重点在这里,接口的语义是什么呢?
其实有很多种,
最广泛的是can-do语义,表约束(Constraint)。
前几天看一些朋友的回帖,大致感觉一些人觉得接口和虚基类差不多。但是我觉得这个是在代码层次上的接近。从设计的角度来说差别就很大了。

class / interface A{}
class B : A {}


A a = new B;
这里,如果A是抽象类,或者无所谓是不是抽象类,表示B也是一个A类的对象。
这里如果A是接口,应该,注意我说是应该表示约束,表示B可以实现了A所约束的行为。

这里所以说它不是赋予了B类以A的属性,是因为,如下述代码:


void draw(IDraw* p)
{
p->draw();
}

函数约束着只有实现了该接口的对象才能被“通过这个方法画出来”,但是是接口赋予了对象可以被画出来的能力嘛?不是。

而真正实现draw的,并非来自于接口本身。比如说Ruby采用Mixins来聚合更多的行为。Java也有一些库来模拟这种语言特征。那么,当一个Java类,继承,聚合或者混入一些方法的时候,这些才真正赋予了一个对象更多的属性和方法。

当然了,这些不是教条,
接口也有其他的语义,比如Proxy。作为Proxy的时候,不强调它被约束了,而是强调接口的handler的作用。


关于implement-with语义,看这里:不过对Java语言来说
http://healerkx.spaces.live.com/blog/cns!9485FFC4816F2CAD!857.entry
而未必采用保护继承实现以-实现的语义。
C++的Loki的Policy Classes基本都是public继承来表达这种含义的。
...全文
1541 42 打赏 收藏 转发到动态 举报
写回复
用AI写文章
42 条回复
切换为时间正序
请发表友善的回复…
发表回复
aiqwe 2010-11-03
  • 打赏
  • 举报
回复
感觉说的比较乱,没有确切的实例来说明,只看到 一下说这个语言一下条到那个语言
俺们村长说 希望你能举个实例来说明比较容易懂~
Bestkiller 2008-06-30
  • 打赏
  • 举报
回复
[Quote=引用 37 楼 mebio 的回复:]
受益匪浅,mark下
[/Quote]
simonn88 2008-06-27
  • 打赏
  • 举报
回复
接分
zixiakoma 2008-06-02
  • 打赏
  • 举报
回复
[Quote=引用楼主 healer_kx 的帖子:]
最近,看到许多人在讨论这方面的问题,我觉得有些朋友给的说法并不是我所认可的。所以我打算聊聊我的想法。当然了,我说的不一定对。
我打算用几种语言来说明这个问题,用我比较熟悉的语言,C/C++,Java,C#,Ruby。

1. 继承(C++中的public继承),通常表达is-a的类关系。
这个没有什么可以说的吧?

然后要说的就是C++支持多继承, Java不支持多继承.
这里要强烈抗议的就是大量的教科书在"Java不支持多继承, 但是支持多接…
[/Quote]

谢谢受教了。
yy80680169 2008-01-25
  • 打赏
  • 举报
回复
Java不支持多继承, 但是支持多接口 强烈鄙视~
mebio 2008-01-23
  • 打赏
  • 举报
回复
受益匪浅,mark下
ttzzgg_80713 2008-01-07
  • 打赏
  • 举报
回复
lz很无聊。鉴定完毕
goodmrning 2008-01-07
  • 打赏
  • 举报
回复
还不错
支持原创
YeLang2007 2008-01-07
  • 打赏
  • 举报
回复

不错不错...

帮你顶....

hustpzb 2008-01-07
  • 打赏
  • 举报
回复
接~~~
he156294775 2008-01-07
  • 打赏
  • 举报
回复
haha
ttzzgg_80713 2008-01-07
  • 打赏
  • 举报
回复
当然看出来啦。但是想到调侃老Mai的事心里过意不去。
你XX我倒无所谓,后面提到你师傅俺就惭愧的汗了
healer_kx 2008-01-07
  • 打赏
  • 举报
回复
呵呵,你开玩笑我能看不出来?难道你看不出来我说着玩的?。。。 。。。
ttzzgg_80713 2008-01-07
  • 打赏
  • 举报
回复
不会是那一次得罪了好多人吧~。郁闷~~其实吧是开玩笑滴。哎~想想确定是过了点。本想开个贴子道歉的又觉得让别人把那个帖子再翻出来不好。所以俺一直都沉默鸟。。
hustpzb 2008-01-07
  • 打赏
  • 举报
回复
有分啊,我接
ttzzgg_80713 2008-01-07
  • 打赏
  • 举报
回复
汗死了~你还记得俺啊。。。。
怎么这么记仇的啊。流汗流汗~~
healer_kx 2008-01-07
  • 打赏
  • 举报
回复
ls的,xx了你哦,你损我师父,还没菜你呢~
haizj0216 2008-01-02
  • 打赏
  • 举报
回复
不错,理解了。
zzkk_1980 2008-01-02
  • 打赏
  • 举报
回复
顶啊
tolast 2008-01-02
  • 打赏
  • 举报
回复
作者真的很厉害,慢慢看
加载更多回复(22)

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧