如何从接口引用实现类
本文关键字:实现 引用 接口 | 更新日期: 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()
或其他。一般来说,我认为这样的设计很糟糕(接口不应该依赖于实际接口的任何实现,而不是接口本身提供的东西)。