8

私は C# でインターフェイスを使用していますが、そのインターフェイスを実装するまったく新しいクラスを作成するのではなく、そのインターフェイスを実装するオブジェクトを作成することは可能ですか? インターフェイスは次のように定義されます。

public interface ITokenStore
{

    IToken CreateRequestToken(IOAuthContext context);


    IToken CreateAccessToken(IOAuthContext context);
}

そして、私はJavaで次のようなことができることを知っています

ITokenStore tokenStore = new ITokenStore()
    {
        IToken CreateRequestToken(IOAuthContext context) {
            IToken requestToken = null;

            return requestToken;
        }

        IToken CreateAccessToken(IOAuthToken context) {
            IToken accessToken = null;

            return accessToken;
        }
    };

c# でインターフェイスのインスタンスをインスタンス化する同等の方法はありますか?

4

7 に答える 7

12

「C# でインターフェイスのインスタンスを作成する」唯一の方法は、インターフェイスを実装する型のインスタンスを作成することです。

于 2013-07-17T19:26:39.313 に答える
4

インターフェイスには、設計上ロジックがありません。彼らは単に実際には何もしません。

実装クラスなしでインスタンス化しても意味がありません

于 2013-07-17T19:28:18.763 に答える
4

本当にこれが必要な場合:

    private static void Main(string[] args)
    {
        IFoo foo = new IFoo(); // <- interface
        foo.Print();

        Console.ReadKey();
    }


    [ComImport, Guid("A7D5E89D-8FBD-44B7-A300-21FAB4833C00"), CoClass(typeof(Foo))]
    public interface IFoo
    {
        void Print();
    }

    public class Foo : IFoo
    {
        public void Print()
        {
            Console.WriteLine("Hello!");
        }
    }

しかし、コンパイル済みのアセンブリを で開くとildasm.exe、次のように表示されます。

IL_0001: newobj instance void TestApp.Program/Foo::.ctor()

于 2013-07-17T19:55:52.090 に答える
2

私の知る限り、.NET には匿名の内部クラスという Java の概念がありません。単体テストのシナリオでは、インターフェイスの動的な実装が必要になることがよくあります。したがって、いくつかの動的モッキングフレームワークを見てみると、たとえば、あなたにとって興味深いかもしれません

  1. Impromptu Interface (動的なサポートを含む)
  2. モク

mockingでタグ付けされたパッケージについては、NuGet ギャラリーをご覧ください。

于 2013-07-17T20:05:14.573 に答える
0

このようなもの:

public class MyTokenStore: ITokenStore
{
    public IToken CreateRequestToken(IOAuthContext context)
    {
        ...some code here...
    }
    public IToken CreateAccessToken(IOAuthContext context)
    {
        ...some code here...
    }
}

次に、それを使用します。

ITokenStore x = new MyTokenStore();
于 2013-07-17T19:31:24.273 に答える
0

C# でインターフェイスのインスタンスを作成することはできません。そのインターフェースを実装するクラス/タイプのインスタンスを作成する必要があります。

C# のインターフェースについて読みたいと思うかもしれません。Java のように「偽造」する方法はありません。

別の言語で利用できるものなので、この概念に興味を持っていただければ幸いです。消費者がダックタイピングを偽造する方法を知っていれば、匿名クラスをデリゲートパラメーターで使用できると思います。しかし、それだけの価値があるとは思えません。

于 2013-07-17T19:29:06.827 に答える
0

他の人が言ったように、いいえ、これは不可能です。

ただし、メソッドごとにデリゲートを持つ 1 つの一般化されたクラスを作成できます。次のようなもの:

public class DelegateTokenStore : ITokenStore
{
    public delegate IToken TokenCreator(IOAuthContext context);
    public TokenCreator RequestTokenCreator { get; set; }
    public TokenCreator AccessTokenCreator { get; set; }

    public IToken CreateRequestToken(IOAuthContext context)
    {
        return RequestTokenCreator(context);
    }

    public IToken CreateAccessToken(IOAuthContext context)
    {
        return AccessTokenCreator(context);
    }
}

次に、次のように使用できます。

ITokenStore tokenStore = new DelegateTokenStore()
{
    RequestTokenCreator = (context) =>
    {
        IToken requestToken = null;
        return requestToken;
    },
    AccessTokenCreator = (context) =>
    {
        IToken accessToken = null;
        return accessToken;
    },
};

このアプローチを取ることが必ずしも良い考えだと言っているわけではありません。何でもそうですが、適切かどうかはユースケースによって異なります。

于 2013-07-17T19:39:55.040 に答える