为什么Delegate和MulticastDelegate类不被视为基类?

时间:2014-06-01 14:38:26

标签: c# inheritance delegates

当我继承Delegate或MulticastDelegate类时,我收到编译器错误,两者都是正常的抽象类,即使我无法继承这些类。

请您告诉我为什么这些课程不被视为基类?

2 个答案:

答案 0 :(得分:10)

因为MulticastDelegate派生类的对象不可变非常非常重要。这确保了当您不知道订阅事件处理程序的任意代码时,状态不会被破坏。 .NET中的不变性由约定实现,您将字段设为私有,不提供属性设置器,不提供默认构造函数。

这不是可以继承的特性,您可以为不可变的基类派生一个类并使其可变。并违反了不变性要求。

因此,编译器有一个关于它的硬烘焙规则,并拒绝您自己从MulticastDelegate派生的尝试。它保留了权利,坚持只能自己正确地执行,您必须使用委托关键字。而且,它会自动为Invoke()和BeginInvoke()方法创建适当的声明,这些声明会强制您以类型安全的方式使用这些方法。

这不会让你失望。

答案 1 :(得分:5)

因为它们是特殊类,为CLR保留

MSDN Says:

  

MulticastDelegate是一个特殊的类。编译器和其他工具可以   派生自这个类,但你不能明确地从它派生。该   Delegate类也是如此。