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)
应该???怎么做?
谢谢,可以.
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)
这违背了你的目标.
| 归档时间: |
|
| 查看次数: |
3333 次 |
| 最近记录: |