在c#中创建接口实例

时间:2013-07-17 19:24:53

标签: c# interface

我在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#中的接口实例?

7 个答案:

答案 0 :(得分:11)

“在c#中创建接口实例”的唯一方法是创建实现接口的类型的实例。

答案 1 :(得分:4)

接口在设计上没有逻辑。他们根本就没有做任何事情。

没有实现类的实例化甚至没有意义

答案 2 :(得分: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()

答案 3 :(得分:2)

据我所知,.NET没有匿名内部类的Java概念。在单元测试场景中通常需要动态实现接口。所以可能看一些动态模拟框架可能对你有意义,例如

  1. Impromptu Interface(包括对动态的支持)
  2. Moq
  3. 在NuGet图库中查看标有 mocking 的软件包。

答案 4 :(得分:0)

您无法在C#中创建接口实例。您必须创建实现该接口的类/类型的实例。

可能想要阅读interfaces in C#。没有办法像Java那样“伪造”它。

我对这个概念很感兴趣,因为它可以用另一种语言提供。如果您的消费者知道如何伪造duck typing,我想您可以使用带有委托参数的匿名类。但这似乎不值得。

答案 5 :(得分: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();

答案 6 :(得分:0)

就像其他人所说的那样,不,这是不可能的。

但是,您可以编写一个具有每个方法的委托的通用类。如下所示:

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;
    },
};

我不是说采用这种方法一定是个好主意。像任何东西一样,适当性取决于你的用例。