最近,看到许多人在讨论这方面的问题,我觉得有些朋友给的说法并不是我所认可的。所以我打算聊聊我的想法。当然了,我说的不一定对。
我打算用几种语言来说明这个问题,用我比较熟悉的语言,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继承来表达这种含义的。

解决方案 »

  1.   

    支持甘草~很多人是接触了C++之后再接触Java。Java的教材上也很习惯的写着,跟C++比较怎样怎样...
      

  2.   

    老实讲,从语法上讲Java是简单的,但是表述能力很弱。通常用几句话就可以说清楚的事情,Java要用很多代码,并且一点都不直观。
      

  3.   

    要自己去设计一个系统,大小不重要,而且要不满于自己的代码,要去重构它,体会就更加深刻了.
    用Java2D做个画图板是个不错的切口.
      

  4.   

    兄弟姐妹们,都发财,都HAPPY
      

  5.   

    或者, 讲个最恰当, 最贴近我们Java程序员的例子.Thread类和Runnable接口的例子.毫无疑问, 当然是Thread类赋予了我们操作线程的能力,
    (new Thread()).start(...);而不是Runnable接口赋予了我们这一切,一个类实现了Runnable接口,鸟用没有,除非你用Thread这样的类才能使得你的类的代码,被加载到线程的栈控件.
    而正是因为你的类被Runnable接口约束了,你才得以将其对象传入Thread.start方法或者Thread的构造方法.在Java的世界里, 这种范式太多了. 理解接口很重要.PS: 不过还是要把视野放远. 不要以为经典就是好.`
      

  6.   

    小草,我严重顶你,刚才看到你骂那个magic250,觉得咱们真是投缘啊!虽然我是C++的初级的初级(我是学C#的,C++刚开始学,有个初级的问题现在还没弄明白,等有空发贴讨教,现在这段时间工作忙),我很崇拜C++的强大、灵活和气质!
      

  7.   

    ls的,xx了你哦,你损我师父,还没菜你呢~
      

  8.   

    当然看出来啦。但是想到调侃老Mai的事心里过意不去。
    你XX我倒无所谓,后面提到你师傅俺就惭愧的汗了
      

  9.   

    Java不支持多继承,   但是支持多接口  强烈鄙视~