最近,看到许多人在讨论这方面的问题,我觉得有些朋友给的说法并不是我所认可的。所以我打算聊聊我的想法。当然了,我说的不一定对。
我打算用几种语言来说明这个问题,用我比较熟悉的语言,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继承来表达这种含义的。
我打算用几种语言来说明这个问题,用我比较熟悉的语言,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继承来表达这种含义的。
解决方案 »
- 有谁用过Java3D,求教个问题.
- JComboBox combo1;监视怎么写,调用的不同的方法
- 关于volatile
- case语句后常量表达式的值为什么不能是实数?如1.1?
- 如何动态加载war包里的web-inf/classes目录里的class文件?
- 请问谁的机器上有 parse_manifest.c version_comp.h manifest_info.h version_comp.c这几个文件
- 一个static变量初始化的问题
- 有关使用jni调用c\c++的问题
- help,关于空值的问题
- jbuilder求教?
- 怎样用java语句实现 类似QQ表情的弹出窗口?
- 怎么样用流的方式读取dbf文件中的数据
用Java2D做个画图板是个不错的切口.
(new Thread()).start(...);而不是Runnable接口赋予了我们这一切,一个类实现了Runnable接口,鸟用没有,除非你用Thread这样的类才能使得你的类的代码,被加载到线程的栈控件.
而正是因为你的类被Runnable接口约束了,你才得以将其对象传入Thread.start方法或者Thread的构造方法.在Java的世界里, 这种范式太多了. 理解接口很重要.PS: 不过还是要把视野放远. 不要以为经典就是好.`
你XX我倒无所谓,后面提到你师傅俺就惭愧的汗了