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

对于我的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()方法,我觉得我的实现不正确。

接口的目的是保证类以某种方式运行

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

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
class
abstract

具体类必须实现
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()方法,因为它已经在接口中声明了。您的第一句话本身就有点崩溃了。默认情况下,接口中的所有方法声明都是抽象的和公共的。如果不显式键入抽象关键字或公共关键字,它们将隐式放置在那里。完美。非常感谢。我不知道我可以用那种方式定义一个公共摘要。但你的解释很清楚。太好了。非常感谢。我没有意识到我可以定义一个公共摘要