如何从接口引用实现类

本文关键字:实现 引用 接口 | 更新日期: 2023-09-27 18:15:17

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

class MyClass : IMyInterface{
    public void MyMethod(MyClass a){...} //implemented from the interface.
}

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

interface IMyInterface{
    void MyMethod(??? a);
}

???部分应该是什么?

谢谢,可以。

如何从接口引用实现类

c#类型系统还不够复杂,不能很好地表示"self"类型的概念。在我看来,理想的解决方案是放弃这个目标,只依赖于接口类型:

interface IMyInterface
{
    void MyMethod(IMyInterface a);
}

如果这还不够,通常表明接口没有明确规定;如果可能的话,你应该回到绘图板上,寻找一个替代的设计。

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

interface IMyInterface<TSelf> where TSelf : IMyInterface<TSelf>
{
    void MyMethod(TSelf a);
}

然后:

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

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

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

与你的目标背道而驰

IMyInterface代替MyClass。它将能够接受从该接口派生并使用该接口的任何内容。如果您出于某种原因不希望这样做,仍然可以这样做,但是在接口中添加一些其他"检查",例如public bool IsValidParam()或其他。一般来说,我认为这样的设计很糟糕(接口不应该依赖于实际接口的任何实现,而不是接口本身提供的东西)。