1. ホーム
  2. java

[解決済み] Java のエラーです。暗黙のスーパーコンストラクタは、デフォルトコンストラクタでは未定義です。

2022-02-17 02:10:19

質問

このような構造の簡単なJavaコードを持っています。

abstract public class BaseClass {
    String someString;
    public BaseClass(String someString) {
        this.someString = someString;
    }
    abstract public String getName();
}

public class ACSubClass extends BaseClass {
    public ASubClass(String someString) {
        super(someString);
    }
    public String getName() {
        return "name value for ASubClass";
    }
}

のサブクラスを相当数用意する予定です。 BaseClass を実装し、それぞれが getName() メソッドを独自の方法で使用することができます ( テンプレートメソッドパターン ).

これはうまくいくのですが、私はサブクラスに冗長なコンストラクタがあるのが好きではありません。型が増えるし、メンテナンスが大変だからです。のメソッドシグネチャを変更するとしたら? BaseClass のコンストラクタを変更すると、すべてのサブクラスを変更しなければならなくなります。

サブクラスからコンストラクタを削除すると、このようなコンパイル時エラーが発生します。

Implicit super constructor BaseClass() is undefined for default constructor. Must define an explicit constructor

私がやろうとしていることは可能なのでしょうか?

どのように解決するのですか?

このエラーが発生するのは、コンストラクタを持たないクラスが デフォルト コンストラクタは引数なしで、次のコードと同じです。

public ACSubClass() {
    super();
}

しかし、BaseClass はコンストラクタを宣言しているので(つまり、コンパイラが提供するデフォルトの引数なしコンストラクタを持たない)、これは違法です - BaseClass を継承するクラスは、このクラスに対して super(); なぜなら、BaseClass には引数なしのコンストラクタが存在しないからです。

これは少し直感に反するかもしれません。というのも、サブクラスはベースクラスが持つあらゆるコンストラクタを自動的に持っていると思うかもしれないからです。

これを回避する最も簡単な方法は、ベースクラスがコンストラクタを宣言しない(つまり、デフォルトの引数なしコンストラクタを持つ)か、宣言済みの引数なしコンストラクタを持つ(それ自体または他のコンストラクタと一緒に)ようにすることです。なぜなら、クラスの正当なインスタンスを作成するために、コンストラクタに渡される引数が必要だからです。