如何实现一个没有定义所有抽象方法的类?

时间:2012-11-01 22:05:32

标签: java class interface polymorphism

对于我的Java类,我们正在学习接口,多态,继承等。

我正在做的家庭作业是一个记忆游戏,你有一对面朝下的牌,你一次翻两个寻找比赛。如果它们匹配,它们将保持可见状态,如果它们不相符,则会将卡片重新打开,然后再挑选两张卡片。

到目前为止我的设计如下:

public interface Hideable
  public abstract void hide();
  public abstract void show();    

public interface Speakable
  public abstract String speak();

public interface AnimalCard extends Hideable, Speakable
  public abstract boolean equals(Object obj);

public class Animal implements AnimalCard
  public void hide() { ... }
  public void show() { ... }
  public boolean equals(Object obj) { ... }

  // What do I do for the speak method since a generic Animal
  // can't speak, but I have to provide a definition since the
  // Animal class is implementing the interfaces.

public class Puppy extends Animal
  // Here is where I need to define the speak method.
  public String speak() { ... }

我的问题在上面的评论中。我觉得我对speak()方法的实现方式不正确。

4 个答案:

答案 0 :(得分:4)

只需制作Animalabstract 具体类必须实现speak(),或者自己为abstract

public class abstract Animal implements AnimalCard {
    public void hide() { ... }
    public void show() { ... }
    public boolean equals(Object obj) { ... }

abstract中为speak()声明Animal方法没有必要或有价值 - 该方法是由类层次结构隐含的。

答案 1 :(得分:1)

界面的目的是保证您的课程将以某种方式行事。

所以如果你声明一个可说话的对象

Speakable speakingThing = new Puppy();

无论你输入什么speakableThing变量必须能够做Speakable接口所说的任何事情。


我做了什么,没有AnimalCard实施Speakable并且只有可以说话的动物实现接口

或者,正如其他人所说,如果你的所有动物都说话,而你永远不会实例化通用动物,那么就要使你的类抽象化。(抽象类不会被实例化。它们只是在那里被继承来自。)

答案 2 :(得分:0)

你可以做出这种改变

 public abstract class  Animal implements AnimalCard{
  public void hide() { }
  public void show() {  }

  public  abstract String speak();
 }

答案 3 :(得分:-1)

首先,

你不能在abstract中使用interface.方法默认情况下它们基本上是抽象的,因为在接口中包含任何实现代码是违法的。

其次,java不支持多重继承,所以你的行:

public interface AnimalCard extends Hideable, Speakable

是非法的。

解决问题后解决问题的最佳方法是使动物卡抽象化。

public abstract Animal extends AnimalCard {
  public void hide() { ... }
  public void show() { ... }
  public boolean equals(Object obj) { ... }  
  public abstract String speak();       
}

public class Puppy extends Animal {
  // Here is where I need to define the speak method.
  public String speak() { ... }
}