理解抽象类和方法并正确覆盖它们

时间:2012-10-19 03:20:20

标签: java inheritance abstract-class abstract-methods

我有一个名为Answer的抽象类。它需要是抽象的,因为假设,可以有许多不同类型的答案,如字符串答案,视频答案,音频答案等。

public abstract class Answer {

abstract public void display();

abstract public Answer getAnswer();

abstract public boolean isEqual();

}

现在在StringAnswer中,我想覆盖这些方法。

public class StringAnswer extends Answer
{
String text;

public StringAnswer(String text)
{
    this.text = text;
}

@Override
public void display()
{
    System.out.println(text);
}

@Override
**public String getAnswer()
{
    return text;
}**

@Override
public boolean isEqual()
{
    // TODO Auto-generated method stub
    return false;
}
}

getAnswer给我带来了问题,因为我正在尝试返回一个字符串,但它期待回复。从抽象的意义上讲,我想回答一个答案。但是,StringAnswer的内容显然是一个String。

那么,当它期待答案时,如何将其作为字符串返回?

4 个答案:

答案 0 :(得分:7)

你没有。你修复了你的设计。

我怀疑你可能会想要的是

abstract class Answer<T> {
  public abstract T getAnswer();
}

public class StringAnswer extends Answer<String> {
  public String getAnswer() { ... }
}

答案 1 :(得分:1)

当你覆盖一个方法时,你有这个规则(来自其他规则):

返回类型必须与重写方法中的返回类型相同或是子类。

鉴于此,String不会延伸Answer,因此您的getAnswer覆盖会出错。

您有两种方法可以修复该方法:

//1st way
@Override
public Answer getAnswer() {
    return this;
}

//2nd way
@Override
public StringAnswer getAnswer() {
    return this;
}

你应该选择你的方式(提示:改变我的覆盖方法的实现!)。

答案 2 :(得分:1)

这就是通用的用途。您可以在此处查看手册:

http://docs.oracle.com/javase/tutorial/java/generics/

答案 3 :(得分:1)

首先,您需要了解抽象类和接口之间的区别。接口指定类必须实现的属性或方法的列表。这可能更适合您的示例。抽象类指定一些功能,通常带有一些具体的实现,然后是一些类似于接口的抽象方法,必须实现。

由于您没有在基类中添加任何功能,我建议使用接口