为什么不抽象字段?

新手上路,请多包涵

为什么 Java 类不能像抽象方法那样具有抽象字段?

例如:我有两个扩展同一个抽象基类的类。这两个类每个都有一个相同的方法,除了 String 常量,这恰好是它们内部的错误消息。如果字段可以是抽象的,我可以使这个常量抽象并将该方法拉入基类。相反,我必须创建一个抽象方法,称为 getErrMsg() 在这种情况下,它返回字符串,在两个派生类中重写这个方法,然后我可以提取方法(现在调用抽象方法)。

为什么我不能一开始就将字段抽象化? Java 可以被设计成允许这样做吗?

原文由 Paul Reiners 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 580
2 个回答

您可以通过在抽象类中有一个在其构造函数中初始化的 final 字段(未经测试的代码)来执行您所描述的操作:

 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,编译器将发出警告错误,就像未实现抽象方法一样。

原文由 rsp 发布,翻译遵循 CC BY-SA 3.0 许可协议

我认为这没有意义。您可以将函数移至抽象类并覆盖一些受保护的字段。我不知道这是否适用于常量,但效果是一样的:

 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 ?我以为你只是想在基类中拥有方法,然后不知道如何处理该字段。

原文由 Felix Kling 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏