Java クラスは、抽象メソッドのように抽象フィールドを持つことができないのはなぜですか?
たとえば、同じ抽象基本クラスを拡張する 2 つのクラスがあります。これら 2 つのクラスには、エラー メッセージである文字列定数を除いて同一のメソッドがそれぞれあります。フィールドを抽象化できる場合は、この定数を抽象化して、メソッドを基本クラスにプルアップできます。代わりに、getErrMsg()
この場合は文字列を返す抽象メソッド (この場合は ) を作成し、このメソッドを 2 つの派生クラスでオーバーライドして、メソッドをプルアップする必要があります (これで抽象メソッドが呼び出されます)。
最初からフィールドを抽象化できなかったのはなぜでしょうか? Java はこれを許可するように設計されていたのでしょうか?
ベストアンサー1
抽象クラスに、コンストラクターで初期化される 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 を初期化するのを「忘れる」と、 抽象メソッドが実装されていない場合と同様に、コンパイラは
警告 エラーを出します。