1. ホーム
  2. c#

[解決済み] 静的メソッド継承に代わる正しい方法とは?

2023-05-08 19:36:51

質問

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();

余分なファクトリークラスは必要ありません。