[解決済み] 静的メソッド継承に代わる正しい方法とは?
質問
C#では静的メソッドの継承がサポートされていないことは承知しています。また、開発者がこの機能の必要性を主張している多くの議論 (ここを含む) を読みましたが、それに対する典型的な回答は、" if you need static member inheritance, there's a flaw in your design" というものでした。
OOP が静的継承について考えることすら望んでいないことを考えると、私の明らかな必要性は、私の設計に誤りがあることを指摘していると結論づけなければなりません。しかし、私は行き詰っています。この問題を解決するための手助けをお願いしたいのです。ここに課題があります...
私はいくつかの複雑な初期化コードをカプセル化した抽象的な基本クラス(Fruitと呼ぶことにしましょう)を作りたいと思います。このコードは、その一部が仮想メソッド呼び出しに依存するため、コンストラクターに配置することはできません。
Fruit は他の具象クラス (Apple、Orange) によって継承され、それぞれのクラスはインスタンスを作成し初期化するために標準のファクトリーメソッド CreateInstance() を公開する必要があります。
静的メンバ継承が可能であれば、私はファクトリーメソッドを基底クラスに置き、具象インスタンスを初期化する必要がある型を取得するために派生クラスへの仮想メソッド呼び出しを使用します。クライアント コードは、完全に初期化された Apple インスタンスを取得するために Apple.CreateInstance() を単純に呼び出すでしょう。
しかし、明らかにこれは不可能です。誰か、同じ機能を収容するために私の設計をどのように変更する必要があるか説明してください。
どのように解決するのですか?
一つのアイデアです。
public abstract class Fruit<T>
where T : Fruit<T>, new()
{
public static T CreateInstance()
{
T newFruit = new T();
newFruit.Initialize(); // Calls Apple.Initialize
return newFruit;
}
protected abstract void Initialize();
}
public class Apple : Fruit<Apple>
{
protected override void Initialize() { ... }
}
というように呼び出す。
Apple myAppleVar = Fruit<Apple>.CreateInstance();
余分なファクトリークラスは必要ありません。
関連
-
[解決済み】データが存在しないのに読み込もうとする試みが無効である
-
[解決済み] C#の正しいバージョン番号を教えてください。
-
[解決済み] キーワード「ref」と「out」の違いは何ですか?
-
[解決済み] Pythonの関数内の静的変数に相当するものは何ですか?
-
[解決済み] C#の文字列の前にある@は何ですか?
-
[解決済み] なぜJavaのmainメソッドは静的なのですか?
-
[解決済み】AngularJSのスコーププロトタイピング/プロトタイピング継承のニュアンスとは?
-
[解決済み】KotlinでJavaの静的メソッドに相当するものは何ですか?
-
[解決済み】インプリメントとエクステンド。いつ使う?その違いは何ですか?
-
[解決済み】C++におけるstaticキーワードとその様々な使用法
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】指定されたキャストが有効でない?
-
[解決済み】スクリプトクラスが見つからないので、スクリプトコンポーネントを追加できない?
-
[解決済み】ここで「要求URIに一致するHTTPリソースが見つかりませんでした」となるのはなぜですか?
-
[解決済み】SmtpException: トランスポート接続からデータを読み取れません:net_io_connectionclosed
-
[解決済み】プロジェクトビルド時のエラー。エディタでスクリプトにコンパイルエラーがあるため、Playerのビルドにエラーが発生する
-
[解決済み】C# ASP.NET使用時に「WebClientのリクエスト中に例外が発生しました。
-
[解決済み】ORA-01008: すべての変数がバインドされていません。これらはバインドされています。
-
[解決済み】取り消せないメンバはメソッドのように使えない?
-
[解決済み] 2つのリストを結合する
-
[解決済み】WebResource.axdとは何ですか?