2

したがって、基本クラスにはパラメーターがあるため、このコードにはエラーがありますか?各サブクラスのデフォルトコンストラクターが基本クラスのデフォルトコンストラクターを呼び出すためですか?エラーの原因となる基本クラスのデフォルトコンストラクターがありませんか?

私はそれを誤解しましたか?また、私はOOPでプログラミングを練習しようとしているので、コードの再利用の原則を実装する際のこれを回避する最善の方法は何ですか?

class A {
    int item;

    A(int item) {
        this.item = item;
    }
}

class B extends A {
    int subitem;

    B(int item) {
        super(item);
        subitem = item * 2;
    }
}

class C extends A {

}
4

2 に答える 2

2

まず、この質問のタイトルについて:

コードの再利用の原則を維持しながら、基本クラスのコンストラクターを継承するサブクラス

コンストラクターが継承されることはありません。それは起こりません。あなたが示してきたのは継承ではありません-それは、コンストラクター(のコンストラクター以外java.lang.Object)が同じクラスの別のコンストラクターにチェーンするか、スーパークラスのコンストラクターにチェーンする必要があるという要件です。

したがって、基本クラスにはパラメーターがあるため、このコードにはエラーがありますか?

正確には、基本クラスにパラメーターのないコンストラクターがないためです。

各サブクラスのデフォルトコンストラクターが基本クラスのデフォルトコンストラクターを呼び出すためですか?

デフォルトのコンストラクターは、コンストラクターを明示的に指定しない場合にのみ提供されます。デフォルトのコンストラクターは、常に基本クラスのパラメーターなしのコンストラクターを暗黙的に呼び出します。

エラーの原因となる基本クラスのデフォルトコンストラクターがありませんか?

基本クラス用のパラメーターなしのコンストラクターはありません。基本的には、次のように書くのと同じです。

class C extends A {
    C() {
        super();
    }
}

それがコンパイルされない理由を理解していれば、明示的に宣言されたコンストラクターがないバージョンは同等であるため、コンパイルされない理由を理解できます。

私はそれを誤解しましたか、またこれを回避するための最良の方法は何ですか

何の周り?Aを指定せずにのインスタンスを作成することはできませんitem。それがコンパイルされたらそれは悪いでしょう-何でしょうitem?のすべてのインスタンスは、Cと見なすこともできます。これには...Aが必要です。item

スーパークラスコンストラクターにある種のデフォルトを提供するパラメーターなしのコンストラクターを作成できます。

public C() {
    super("default item");
}

それがあなたが望むものなら。しかし、それを超えて、私たちはあなたが何を達成しようとしているのかを知らずに代替案を実際に提案することはできません。

継承はコードの再利用を実現する唯一の方法ではないことに注意してください。実際、私は一般的に継承ではなく、コンポジションを介した再利用を個人的に好みます。継承は強力ですが、IMOを使いすぎています。

于 2013-01-17T16:13:52.923 に答える
0

クラスCは拡張Aされ、コンストラクターで1つの引数のコンストラクターを明示的に呼び出すという契約を満たす必要があります。または、次のように、クラスAで引数なしのデフォルトコンストラクターを定義することもできます。

class A {
    int item;

    A(int item) {
        this.item = item;
    }
    A(){
     //default stuff
     }
}
于 2013-01-17T16:13:51.187 に答える