abstract class A<T> where T:A<T>
{
public event Action<T> Event1;
}
class B : A<B>
{
//has a field called Action<B> Event1;
}
Run Code Online (Sandbox Code Playgroud)
有没有更优雅的方式来做到这一点?我希望基类中的东西(事件等)能够使用子类的类型.
您使用的模式实际上并未实现您想要的约束.假设您想要模仿"动物只能与自己的某种东西友好":
abstract class Animal<T> where T : Animal<T>
{
public abstract void GetFriendly(T t);
}
class Cat : Animal<Cat>
{
public override void GetFriendly(Cat cat) {}
}
Run Code Online (Sandbox Code Playgroud)
我们是否成功实现了所需的约束?没有.
class EvilDog : Animal<Cat>
{
public override void GetFriendly(Cat cat) {}
}
Run Code Online (Sandbox Code Playgroud)
现在,一只邪恶的狗可以与任何猫友好,并且与其他邪恶的狗不友好.
您想要的类型约束在C#类型系统中是不可能的.如果需要类型系统强制执行此类约束,请尝试Haskell.
有关详细信息,请参阅我关于此主题的文章:
http://blogs.msdn.com/b/ericlippert/archive/2011/02/03/curiouser-and-curiouser.aspx