abstract class A<T> where T:A<T>
{
public event Action<T> Event1;
}
class B : A<B>
{
//has a field called Action<B> Event1;
}
有没有更优雅的方法来做到这一点?我希望基类中的内容(事件等)能够使用子类的类型。
您使用的模式实际上并没有实现您想要的约束。假设您想要建模“动物只能与同类的动物友好相处”:
abstract class Animal<T> where T : Animal<T>
{
public abstract void GetFriendly(T t);
}
class Cat : Animal<Cat>
{
public override void GetFriendly(Cat cat) {}
}
我们是否成功地实现了所需的约束?不。
class EvilDog : Animal<Cat>
{
public override void GetFriendly(Cat cat) {}
}
现在,邪恶的狗可以与任何猫友好,但与其他邪恶的狗不友好。
您想要的类型约束在 C# 类型系统中是不可能的。如果您需要类型系统强制执行的这种约束,请尝试 Haskell。
有关更多详细信息,请参阅我关于此主题的文章:
http://blogs.msdn.com/b/ericlippert/archive/2011/02/03/curiouser-and-curiouser.aspx
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)