为什么不抽象字段?
为什么Java类不能像抽象方法那样具有抽象字段?
例如:我有两个类扩展相同的抽象基类。这两个类都有一个相同的方法,除了其中的 String 常量(恰好是错误消息)除外。如果字段可以是抽象的,我可以使这个常量抽象,并将方法拉到基类中。相反,我必须创建一个抽象方法(在本例中称为),该方法返回 String,在两个派生类中重写此方法,然后我可以提取该方法(现在调用抽象方法)。getErrMsg()
为什么我不能一开始就把这个领域抽象出来呢?Java可以被设计成允许这样做吗?
为什么Java类不能像抽象方法那样具有抽象字段?
例如:我有两个类扩展相同的抽象基类。这两个类都有一个相同的方法,除了其中的 String 常量(恰好是错误消息)除外。如果字段可以是抽象的,我可以使这个常量抽象,并将方法拉到基类中。相反,我必须创建一个抽象方法(在本例中称为),该方法返回 String,在两个派生类中重写此方法,然后我可以提取该方法(现在调用抽象方法)。getErrMsg()
为什么我不能一开始就把这个领域抽象出来呢?Java可以被设计成允许这样做吗?
您可以通过在抽象类中具有在其构造函数(未经测试的代码)中初始化的最终字段来执行您所描述的操作:
abstract class Base {
final String errMsg;
Base(String msg) {
errMsg = msg;
}
abstract String doSomething();
}
class Sub extends Base {
Sub() {
super("Sub message");
}
String doSomething() {
return errMsg + " from something";
}
}
如果子类“忘记”通过超级构造函数初始化 final,编译器将发出错误警告,就像未实现抽象方法一样。
我认为这毫无意义。您可以将函数移动到抽象类,然后只重写一些受保护的字段。我不知道这是否适用于常量,但效果是相同的:
public abstract class Abstract {
protected String errorMsg = "";
public String getErrMsg() {
return this.errorMsg;
}
}
public class Foo extends Abstract {
public Foo() {
this.errorMsg = "Foo";
}
}
public class Bar extends Abstract {
public Bar() {
this.errorMsg = "Bar";
}
}
所以你的观点是,你想在子类中强制实施/覆盖/任何东西?我以为你只是想在基类中拥有方法,当时不知道如何处理这个领域。errorMsg