浏览 3217 次
锁定老帖子 主题:JAVA多重继承思考
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-11-02
先贴一段代码(<JAVA编程思想>(中文版)第179页): interface CanFight { void fight(); } interface CanSwim { void swim(); } interface CanFly { void fly(); } interface CanClimb{ void climb(); } class ActionCharacter { public void fight() {} } class Hero extends ActionCharacter implements CanFight, CanSwim, CanFly, CanClimb { public void swim() {} public void fly() {} public void climb() {} } public class Adventure { //代理 public static void t(CanFight x) { x.fight(); } public static void u(CanSwim x) { x.swim(); } public static void v(CanFly x) { x.fly(); } public static void w(ActionCharacter x) { x.fight(); } public static void c(CanClimb x){ x.climb(); } public static void main(String[] args) { Hero h = new Hero(); t(h); // Treat it as a CanFight u(h); // Treat it as a CanSwim v(h); // Treat it as a CanFly w(h); // Treat it as an ActionCharacter c(h); } } Hero类组合了基类ActionCharacter和接口CanFlight,CanSwim和CanFly,当通过这种方式将一个具体类和多个接口组合到一起时,具体类必须在前,接口在后(否则会报错). CanFight接口与ActionCharacter的fight()方法特征签名一样,这样,Hero中就没有必要再提供fight()的定义了,因为这个定义会在编译的初期随着调用ActionCharacter基类而定义好. 这也提示了子类遵循某个接口或继承某个基类的不同之处.用通俗的话可以这样说: 接口是告诉这个类,我有的东西,你必须得有.(即接口有的方法定义,在子类定义时必须都重新定义一遍) 基类是告诉这个子类,我有的东西,你可以拿去用.(即基类有的方法定义,子类可以直接继承下去而不必重新定义)
接口的继承又会是另一种情形,它类似于类的继承. nterface Sleep { void haveSleep(); } interface Rest extends Sleep//接口的继承也是用extends关键字 { //void haveSleep();//这些都是没 有必要的. void haveRest(); } interface Nap extends Sleep { //void haveSleep(); void haveNap(); } interface nod extends Rest, Nap { //void haveSleep(); //void haveRest(); //void haveNap(); void haveNod(); } 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-11-02
建议不要再拿接口来忽悠出什么多重继承了。
原本初学的时候就是这些地方搞不明白,被这一忽悠更不明白了。 内容错误: CanFight接口与ActionCharacter的fight()方法特征签名一样,这样,Hero中就没有必要再提供fight()的定义了 class ActionCharacter { public void act() {} } ActionCharacter并未提供fight()方法。所以你的说明是错误的。 将act()改为fight才符合你说的。 class ActionCharacter { public void fight() {} } 发布前请先验证。 如果你是对书上抄的,难怪有人说需要有一定经验才能看懂。 中文描述也太不清楚了。 |
|
返回顶楼 | |
发表时间:2008-11-02
风花雪月饼 写道 建议不要再拿接口来忽悠出什么多重继承了。 原本初学的时候就是这些地方搞不明白,被这一忽悠更不明白了。 内容错误: CanFight接口与ActionCharacter的fight()方法特征签名一样,这样,Hero中就没有必要再提供fight()的定义了 Java代码 class ActionCharacter { public void act() {} } class ActionCharacter { public void act() {} } ActionCharacter并未提供fight()方法。所以你的说明是错误的。 将act()改为fight才符合你说的。 Java代码 class ActionCharacter { public void fight() {} } class ActionCharacter { public void fight() {} } 发布前请先验证。 如果你是对书上抄的,难怪有人说需要有一定经验才能看懂。 中文描述也太不清楚了。 呵呵.不好意思..我其实 是看thinking in java看到这里想到了这些,所以找个地方把想到的东西备份一下..以后好回过头来看.属于很私人的行为.没有想过要拿出来教导别人的..呵 说实话,我对接口这章也不太懂... 另外,你看东西好仔细,那是我后来为了测试改的代码,现在已经改回来了..谢谢了... |
|
返回顶楼 | |