104

重複の可能性:
C# で静的メソッドがインターフェイスを実装できないのはなぜですか?

TestRepository私のアプリケーションでは、生データ アクセス ( 、など)SqlRepositoryを行うリポジトリを使用したいと考えています。FlatFileRepositoryこのようなリポジトリはアプリケーションのランタイム全体で使用されるため、それを静的クラスにすることは賢明なことのように思えました。

SqlRepository.GetTheThingById(5);

常に再生成する必要はありません。リポジトリを交換可能にしたいので、共通のインターフェースを実装する必要があります: IRepository. しかし、そうしようとすると、次のようになります。

静的クラスはインターフェースを実装できません

なぜ彼らはできないのですか?では、デザインを変更することをどのように提案しますか? 使用できるパターンはありますか?

更新
5 年後: この質問は 2 万回以上訪れ、リポジトリ パターンの欠点について学び、IoC について学び、私の質問が不十分に定式化されていることに気付きました。

インターフェイスの C# 仕様が何であるかを実際に尋ねたわけではなく、なぜこの特定の方法で故意に私を制限していたのかということです。

実際の答えは、インスタンスまたは型でメソッドを呼び出すための構文が異なるということです。しかし、質問は閉じられています。

4

3 に答える 3

43

インターフェイスに静的メソッドを含めることはできません。インターフェイスを実装するクラスは、それらすべてをインスタンス メソッドとして実装する必要があります。静的クラスはインスタンス メソッドを持つことができません。QED。

于 2009-08-12T14:15:52.003 に答える
18

私たちの経験が役に立つかもしれません。SqlRepository を静的クラスとして使用するのではなく、注入に AutoFac を使用し、コンテナーを静的クラスの背後に隠します。次に、各エンティティには静的リポジトリ プロパティがあります。

public class Part : inheritence...
{
    public static IPartRepository Repository
    {
        get { return IoCContainer.GetInstance<IRepository<Part>>(); }
    }
    // ... more part-y stuff
}

このようにして、実装を交換することができ、呼び出し元は常にそれを取得する場所を知っています。

Part p = Part.Repository.Get(id);

別のプロジェクトには、コンテナに登録された PartRepository があります。

public class PartRepository : IPartRepository
{
    // IPartRepository implementation that talks to injected DAL
}

さらに別のプロジェクトでは、既知の全体がプリロードされたリポジトリを含む、テスト用のモックがあります。

public class MockPartRepository : Dictionary<Part, int>, IPartRepository
{
    // IPartRepository implementation based on dictionary
}

...そして、単体テスト用のコンテナーに登録されます。SAME 呼び出しはリポジトリを取得します。

Part p = Part.Repository.Get(id);
于 2009-08-12T14:16:32.627 に答える
13

定義上、インターフェースはインスタンスが履行するためのコントラクトを作成します。静的クラスをインスタンス化できないため、静的クラスはインターフェイスを実装できません。

静的リポジトリを持つ必要はありません。非静的にして、必要なときにインスタンス化するだけです。

于 2009-08-12T14:17:13.060 に答える