繁体   English   中英

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

[英]Understanding abstract classes and methods and overriding them properly

我有一个名为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给我带来了问题,因为我正在尝试返回一个String,但是它期望得到答案。 从抽象的意义上讲,我想返回一个答案。 但是,StringAnswer的内容显然将是一个String。

因此,当期望答案时,如何将其作为字符串返回?

你不知道 您修复您的设计。

我怀疑您可能想要的是

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

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

覆盖方法时,您具有以下规则(来自其他规则):

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

鉴于此, String不会扩展Answer ,因此您的getAnswer覆盖将是错误的。

您有两种方法可以解决此问题:

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

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

您应该选择自己的方式(提示:更改我对override方法的实现!)。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM