我正在考虑MulticastDelegate和Delegate,我不明白为什么调用方法不是MulticastDelegate的抽象方法。有人知道吗?
答案 0 :(得分:1)
MulticastDelegate
类型没有Invoke()
方法(也不是BeginInvoke()
)。这些方法由运行时自动以实际delegate
类型提供。因此,问题的最明显原因是"为什么Invoke()
MulticlassDelegate
方法标记为abstract
"是没有这样的方法。
如果你问为什么那个方法不在MulticlassDelegate
(然后在那里标记为abstract
),那么我会问你:它怎么可能?每个委托类型都需要自己的Invoke()
方法,因为该方法的签名特别取决于委托类型的签名。没有基类可以提供该类型。
最后,请注意MulticlassDelegate
类型是其中之一"特殊" .NET中的类型,明确意图不由用户代码继承。不是它,也不是该类型的任何声明的delegate
子类。由于继承是不可能的,因此成员是abstract
是否真的无关紧要;即使它是,也不会对任何人有任何好处。
Delegate类是委托类型的基类。但是,只有系统和编译器可以从Delegate类或MulticastDelegate类显式派生。也不允许从委托类型派生新类型。 Delegate类不被视为委托类型;它是一个用于派生委托类型的类。
大多数语言都实现了一个委托关键字,这些语言的编译器可以从MulticastDelegate类派生出来;因此,用户应使用该语言提供的委托关键字。
- 注意:
公共语言运行库为每个委托类型提供一个Invoke方法,其签名与委托相同。您不必从C#,Visual Basic或Visual C ++中显式调用此方法,因为编译器会自动调用它。当您想要查找委托类型的签名时,Invoke方法在反射中很有用。