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. 即兴界面(包括对动态的支持)
  2. 起订量

在 NuGet 库中查看带有mocking标记的包。

于 2013-07-17T20:05:14.573 回答
0

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

可能想阅读C# 中的接口。没有办法像 Java 那样“伪造”它。

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

于 2013-07-17T19:29:06.827 回答
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

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

但是,您可以编写一个通用类,其中每个方法都有委托。类似于以下内容:

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 回答