Java 如何实现不使用';你不能定义所有的抽象方法吗?
对于我的Java类,我们正在学习接口、多态性、继承等 我正在做的家庭作业是一个记忆游戏,你有一对正面朝下的卡片,你一次翻两张来寻找一场比赛。如果它们匹配,它们将保持可见,如果它们不匹配,则将牌翻转过来,您再选择两张牌 到目前为止,我的设计如下:Java 如何实现不使用';你不能定义所有的抽象方法吗?,java,class,interface,polymorphism,Java,Class,Interface,Polymorphism,对于我的Java类,我们正在学习接口、多态性、继承等 我正在做的家庭作业是一个记忆游戏,你有一对正面朝下的卡片,你一次翻两张来寻找一场比赛。如果它们匹配,它们将保持可见,如果它们不匹配,则将牌翻转过来,您再选择两张牌 到目前为止,我的设计如下: public interface Hideable public abstract void hide(); public abstract void show(); public interface Speakable publi
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()方法,我觉得我的实现不正确。接口的目的是保证类以某种方式运行 所以如果你声明一个可说出的对象
Speakable speakingThing = new Puppy();
无论您在speakableThing
变量中放入什么,都必须能够执行Speakable
接口所说的任何操作
我要做的是,没有
AnimalCard
实现Speakable
,只有会说话的动物实现接口
或者,正如其他人所说,如果你的所有动物都会说话,而你永远不会实例化泛型动物,那么就把你的类抽象化。(抽象类不会被实例化。它们只是从中继承的。)接口的目的是保证类以某种方式运行 所以如果你声明一个可说出的对象
Speakable speakingThing = new Puppy();
无论您在speakableThing
变量中放入什么,都必须能够执行Speakable
接口所说的任何操作
我要做的是,没有
AnimalCard
实现Speakable
,只有会说话的动物实现接口
或者,正如其他人所说,如果你的所有动物都会说话,而你永远不会实例化泛型动物,那就把你的类抽象化。(抽象类不会被实例化。它们只是从中继承的。)你可以做出这样的改变
public abstract class Animal implements AnimalCard{
public void hide() { }
public void show() { }
public abstract String speak();
}
你可以做出这样的改变
public abstract class Animal implements AnimalCard{
public void hide() { }
public void show() { }
public abstract String speak();
}
只需制作
maro
classabstract
具体类必须实现
speak()
,或者本身是抽象的
public class abstract Animal implements AnimalCard {
public void hide() { ... }
public void show() { ... }
public boolean equals(Object obj) { ... }
在Animal
中为speak()
声明abstract
方法没有必要也没有价值-该方法由类层次结构暗示。只需将Animal
类抽象
具体类必须实现speak()
,或者本身是抽象的
public class abstract Animal implements AnimalCard {
public void hide() { ... }
public void show() { ... }
public boolean equals(Object obj) { ... }
在Animal
中为speak()
声明abstract
方法既没有必要也没有价值-该方法由类层次结构暗示。首先
在接口中不能有abstract
方法。
它们在默认情况下基本上是抽象的,因为在接口中有任何实现代码都是非法的
其次,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() { ... }
}
首先,
在接口中不能有abstract
方法。
它们在默认情况下基本上是抽象的,因为在接口中有任何实现代码都是非法的
其次,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() { ... }
}
让它抽象
,让第一个具体实现处理仍然抽象的方法的实现。@LuiggiMendoza我的印象是,我不能在类中声明抽象方法,只能在接口中声明。我错了吗?是的,你错了。根据定义,抽象类是可以包含抽象方法的类。当然,它不能被实例化。看得很好。我不知道在这种情况下我可以将动物类定义为抽象类。@Bart我的错,抱歉。我想我在math.stackexchange上花了太多的时间:-)把它也变成抽象的
,让第一个具体的实现处理仍然抽象的方法的实现。@LuiggiMendoza我的印象是,我不能在类中声明抽象方法,只能在接口中声明。我错了吗?是的,你错了。根据定义,抽象类是可以包含抽象方法的类。当然,它不能被实例化。看得很好。我不知道在这种情况下我可以将动物类定义为抽象类。@Bart我的错,抱歉。我想我花了太多时间在math.stackexchange:-)不需要添加speak方法定义:它已经在接口中声明。不需要添加speak方法定义:它已经在接口中声明。一个接口可以扩展多个接口。AnimalCard接口是合法的。而且没有必要重新定义speak()方法,因为它已经在接口中声明了。您的第一句话本身就有点崩溃了。默认情况下,接口中的所有方法声明都是抽象的和公共的。如果不显式键入抽象关键字或公共关键字,它们将隐式放置在那里。一个接口可以扩展多个接口。AnimalCard接口是合法的。而且没有必要重新定义speak()方法,因为它已经在接口中声明了。您的第一句话本身就有点崩溃了。默认情况下,接口中的所有方法声明都是抽象的和公共的。如果不显式键入抽象关键字或公共关键字,它们将隐式放置在那里。完美。非常感谢。我不知道我可以用那种方式定义一个公共摘要。但你的解释很清楚。太好了。非常感谢。我没有意识到我可以定义一个公共摘要