[英]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方法的实现!)。
这就是泛型的用途。 您可以在此处查看手册:
首先,您需要了解抽象类和接口之间的区别。 接口指定类必须实现的属性或方法的列表。 这可能更适合您的示例。 一个抽象类指定了一些功能,通常带有一些具体的实现,然后指定了一些必须类似于接口的抽象方法。
由于您没有在基类中添加任何功能,因此建议使用一个接口
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.