なぜ抽象フィールドではないのか?質問する

なぜ抽象フィールドではないのか?質問する

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 を初期化するのを「忘れる」と、 抽象メソッドが実装されていない場合と同様に、コンパイラは 警告 エラーを出します。

おすすめ記事