对于我的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()方法的实现方式不正确。
答案 0 :(得分:4)
只需制作Animal
班abstract
具体类必须实现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() { ... }
}