まず、この質問のタイトルについて:
コードの再利用の原則を維持しながら、基本クラスのコンストラクターを継承するサブクラス
コンストラクターが継承されることはありません。それは起こりません。あなたが示してきたのは継承ではありません-それは、コンストラクター(のコンストラクター以外java.lang.Object
)が同じクラスの別のコンストラクターにチェーンするか、スーパークラスのコンストラクターにチェーンする必要があるという要件です。
したがって、基本クラスにはパラメーターがあるため、このコードにはエラーがありますか?
正確には、基本クラスにパラメーターのないコンストラクターがないためです。
各サブクラスのデフォルトコンストラクターが基本クラスのデフォルトコンストラクターを呼び出すためですか?
デフォルトのコンストラクターは、コンストラクターを明示的に指定しない場合にのみ提供されます。デフォルトのコンストラクターは、常に基本クラスのパラメーターなしのコンストラクターを暗黙的に呼び出します。
エラーの原因となる基本クラスのデフォルトコンストラクターがありませんか?
基本クラス用のパラメーターなしのコンストラクターはありません。基本的には、次のように書くのと同じです。
class C extends A {
C() {
super();
}
}
それがコンパイルされない理由を理解していれば、明示的に宣言されたコンストラクターがないバージョンは同等であるため、コンパイルされない理由を理解できます。
私はそれを誤解しましたか、またこれを回避するための最良の方法は何ですか
何の周り?A
を指定せずにのインスタンスを作成することはできませんitem
。それがコンパイルされたらそれは悪いでしょう-何でしょうかitem
?のすべてのインスタンスは、C
と見なすこともできます。これには...A
が必要です。item
スーパークラスコンストラクターにある種のデフォルトを提供するパラメーターなしのコンストラクターを作成できます。
public C() {
super("default item");
}
それがあなたが望むものなら。しかし、それを超えて、私たちはあなたが何を達成しようとしているのかを知らずに代替案を実際に提案することはできません。
継承はコードの再利用を実現する唯一の方法ではないことに注意してください。実際、私は一般的に継承ではなく、コンポジションを介した再利用を個人的に好みます。継承は強力ですが、IMOを使いすぎています。