C#中是否有任何方法可以使用通用类型,该类型始终是接口中的实现类型?像这样:
interface Foo
{
this GetOtherThis();
}
class Bar : Foo
{
Bar GetOtherThis();
}
答案 0 :(得分:5)
C#中是否有任何方法可以使用通用类型,该类型始终是接口中的实现类型?
没有。到目前为止给出的答案不满足了这个要求,原因有两个:
您始终可以使用不同的T
interface IFoo<T>
{
T GetOtherThis();
}
public class NotAString : Foo<string>
{
string GetOtherThis() { ... }
}
这可以通过约束来修复某处:interface IFoo<T> where T : IFoo<T>
但是仍然没有停止;
public class Good : IFoo<Good> { ... }
public class Evil : IFoo<Good> { /* Mwahahahaha */ }
无论如何继承都会破坏它:
interface IFoo<T>
{
T GetOtherThis();
}
public class WellBehaved : IFoo<WellBehaved>
{
WellBehaved GetOtherThis() { ... }
}
public class BadlyBehaved : WellBehaved
{
// Ha! Now x.GetOtherThis().GetType() != x.GetType()
}
基本上C#中没有任何内容可以为您强制执行此操作。如果您认为接口实现是合理的,那么通用接口方案仍然有用,但您需要了解其局限性。
答案 1 :(得分:2)
是的,您可以使用通用接口编写代码:
interface Foo<T>
{
T GetOtherThis();
}
class Bar : Foo<Bar>
{
Bar GetOtherThis();
}
注意:您可以在T
上放置通用约束,以使T
成为实施类。 Jon Skeet更详细地解释了它。