我在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#中的接口实例?
答案 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概念。在单元测试场景中通常需要动态实现接口。所以可能看一些动态模拟框架可能对你有意义,例如
在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;
},
};
我不是说采用这种方法一定是个好主意。像任何东西一样,适当性取决于你的用例。