论坛首页 Java企业应用论坛

JAVA多重继承思考

浏览 3217 次
精华帖 (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();
}
 
   发表时间:2008-11-02  
建议不要再拿接口来忽悠出什么多重继承了。
原本初学的时候就是这些地方搞不明白,被这一忽悠更不明白了。

内容错误:
CanFight接口与ActionCharacter的fight()方法特征签名一样,这样,Hero中就没有必要再提供fight()的定义了

class ActionCharacter {  
   public void act() {}  
} 


ActionCharacter并未提供fight()方法。所以你的说明是错误的。
将act()改为fight才符合你说的。
class ActionCharacter {  
   public void fight() {}  
} 


发布前请先验证。

如果你是对书上抄的,难怪有人说需要有一定经验才能看懂。
中文描述也太不清楚了。
1 请登录后投票
   发表时间:2008-11-02  
风花雪月饼 写道

建议不要再拿接口来忽悠出什么多重继承了。
原本初学的时候就是这些地方搞不明白,被这一忽悠更不明白了。

内容错误:
CanFight接口与ActionCharacter的fight()方法特征签名一样,这样,Hero中就没有必要再提供fight()的定义了

Java代码 class&nbsp;ActionCharacter&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;act()&nbsp;{}&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;class ActionCharacter { 
   public void act() {} 
}


ActionCharacter并未提供fight()方法。所以你的说明是错误的。
将act()改为fight才符合你说的。
Java代码 class&nbsp;ActionCharacter&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;fight()&nbsp;{}&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;class ActionCharacter { 
   public void fight() {} 
}


发布前请先验证。

如果你是对书上抄的,难怪有人说需要有一定经验才能看懂。
中文描述也太不清楚了。

呵呵.不好意思..我其实 是看thinking in java看到这里想到了这些,所以找个地方把想到的东西备份一下..以后好回过头来看.属于很私人的行为.没有想过要拿出来教导别人的..呵
说实话,我对接口这章也不太懂...
另外,你看东西好仔细,那是我后来为了测试改的代码,现在已经改回来了..谢谢了...
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics