【发布时间】:2019-01-07 15:03:43
【问题描述】:
当我继承 Delegate 或 MulticastDelegate 类时,我遇到编译器错误,这两个都是普通的抽象类,即使我无法继承这些类。
您能告诉我为什么这些类不被视为基类吗?
【问题讨论】:
标签: c# inheritance delegates
当我继承 Delegate 或 MulticastDelegate 类时,我遇到编译器错误,这两个都是普通的抽象类,即使我无法继承这些类。
您能告诉我为什么这些类不被视为基类吗?
【问题讨论】:
标签: c# inheritance delegates
因为 MulticastDelegate 的派生类的对象是不可变的,这一点非常非常重要。这确保了当您不知道的任意代码订阅事件处理程序时,状态不会被破坏。 .NET 中的不变性由约定实现,您将字段设为私有,不提供属性设置器,不提供默认构造函数。
这不是可以继承的特征,您可以为不可变的基类派生一个类并使其可变。并且违反了不变性要求。
因此,编译器对此有一个严格的规则,并拒绝您自己从 MulticastDelegate 派生的尝试。它保留权利,坚持它只能自己正确完成,您必须使用 delegate 关键字。并且做得更多,它会自动为 Invoke() 和 BeginInvoke() 方法创建正确的声明,这些声明强制您以类型安全的方式使用这些方法。
这不会减慢您的速度。
【讨论】:
因为它们是特殊的类,为 CLR 保留
MulticastDelegate 是一个特殊的类。编译器和其他工具可以 从这个类派生,但你不能显式地从它派生。这 Delegate 类也是如此。
【讨论】: