[解決済み] コンストラクタを継承する方法は?
2022-04-14 03:41:20
質問
想像してみてください 多くのコンストラクタと仮想メソッドを持つ基底クラスです。
public class Foo
{
...
public Foo() {...}
public Foo(int i) {...}
...
public virtual void SomethingElse() {...}
...
}
そして、その仮想メソッドをオーバーライドする子孫クラスを作りたいのです。
public class Bar : Foo
{
public override void SomethingElse() {...}
}
そして、もうひとつの子孫は、さらにいろいろなことをします。
public class Bah : Bar
{
public void DoMoreStuff() {...}
}
本当にFooからBarとBahにすべてのコンストラクタをコピーする必要があるのでしょうか?そして、Foo のコンストラクタのシグネチャを変更したら、Bar と Bah でもそれを更新しなければならないのでしょうか?
コンストラクタを継承する方法はないのでしょうか?コードの再利用を促進する方法はないのでしょうか?
どうすれば解決するの?
はい、各派生に意味のあるコンストラクタを実装し、その上で
base
キーワードを使用して、そのコンストラクタを適切な基底クラスまたは
this
キーワードを使用すると、 コンストラクタを同じクラスの別のコンストラクタに振り向けることができます。
もしコンパイラがコンストラクタの継承について仮定していたら、私たちはオブジェクトがどのようにインスタンス化されるかを適切に判断することができません。ほとんどの場合、なぜそんなに多くのコンストラクタがあるのかを考え、ベースクラスで1つか2つだけに減らすことを検討すべきです。派生クラスでは、次のような定数値でその一部をマスクすることができます。
null
を作成し、必要なものだけをコンストラクタで公開します。
更新情報
C#4 では、デフォルトのパラメータ値を指定し、名前付きパラメータを使用することで、構成ごとに 1 つのコンストラクタを持つのではなく、複数の引数構成に 1 つのコンストラクタで対応できるようになりました。
関連
-
[解決済み】コンパイルエラー「未割り当てのローカル変数を使用しています」が発生したのはなぜですか?
-
[解決済み] UnityでOnCollisionEnterが呼ばれない
-
[解決済み】スレッド終了またはアプリケーションの要求により、I/O操作が中断されました。
-
[解決済み] enumを列挙するには
-
[解決済み] intをenumにキャストするにはどうすればよいですか?
-
[解決済み] 辞書を繰り返し使用するには?
-
[解決済み] Java で、あるコンストラクタを別のコンストラクタから呼び出すにはどうすればよいですか?
-
[解決済み] なぜList<T>を継承しないのですか?
-
[解決済み] Pythonのクラスはなぜオブジェクトを継承するのですか?
-
[解決済み】Pythonで複数のコンストラクタを持つためのクリーンでPythonicな方法は何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】スクリプトクラスが見つからないので、スクリプトコンポーネントを追加できない?
-
[解決済み】C#で四捨五入する方法
-
[解決済み] 保護レベルによりアクセス不能になりました。
-
[解決済み】統合マネージドパイプラインモードで適用されないASP.NETの設定が検出された
-
[解決済み】C# - パスに不正な文字がある場合
-
[解決済み】Moqを使用してメソッド呼び出しを検証する
-
[解決済み】パラメータ付きRedirectToAction
-
[解決済み】ファイルやアセンブリ、またはその依存関係の1つをロードできませんでした。
-
VSでscanfエラーを恒久的に解決するには、ソースファイルを作成し、自動的に#define _CRT_SECURE_NO_WARNINGS 1を追加してください。
-
[解決済み】データが存在しないのに読み込もうとする試みが無効である