如何从接口引用实现类?

Can*_*ğlu 1 .net c# interface c#-4.0

我正在创建一个接口,我需要一个方法来引用实现该接口的类的类实例.这是一个例子:

class MyClass : IMyInterface{
    public void MyMethod(MyClass a){...} //implemented from the interface.
}
Run Code Online (Sandbox Code Playgroud)

那么我应该如何实现我的接口(没有泛型)来引用它实现的类?

interface IMyInterface{
    void MyMethod(??? a);
}
Run Code Online (Sandbox Code Playgroud)

应该???怎么做?

谢谢,可以.

Ani*_*Ani 9

C#类型系统不够复杂,不能很好地代表"自我"类型的概念.IMO,理想的解决方案是放弃这个目标,只依赖于接口类型:

interface IMyInterface
{
    void MyMethod(IMyInterface a);
}
Run Code Online (Sandbox Code Playgroud)

如果这不够,通常暗示接口指定不当; 如果可能的话,你应该回到绘图板并寻找替代设计.

但是如果你真的需要这个,你可以使用CRTP的(有点)C#版本:

interface IMyInterface<TSelf> where TSelf : IMyInterface<TSelf>
{
    void MyMethod(TSelf a);
}
Run Code Online (Sandbox Code Playgroud)

然后:

class MyClass : IMyInterface<MyClass>
{
    public void MyMethod(MyClass a) {...}  //implemented from the interface.
}
Run Code Online (Sandbox Code Playgroud)

请注意,这不是一个完全"安全"的解决方案; 没有什么能阻止邪恶的实现使用不同的类型参数:

class EvilClass : IMyInterface<MyClass>  // TSelf isn't the implementing type anymore...
{
    public void MyMethod(MyClass a) {...}  // Evil...
}
Run Code Online (Sandbox Code Playgroud)

这违背了你的目标.