7

在 VB.NET 中有一个关键字'shadows'。假设我有一个名为“Jedi”的基类和一个名为“Yoda”的派生类,它继承自“Jedi”。如果我在“Jedi”中声明一个名为“ForcePush”的方法并在“Yoda”中将其隐藏,那么当在“Yoda”类的实例上调用该方法时,它将忽略基类实现并使用派生类的实现. 但是,如果我有一个最初声明为“Jedi”类型的“Yoda”实例,即Dim j as Jedi = new Yoda(),并在该实例上调用“ForcePush”方法,它将使用 Jedi 实现。

现在假设我有一个名为“UsingForce”的事件,它在调用“ForcePush”方法时引发,并且我在派生类中隐藏了该事件(这是因为“Yoda”有一个接口“IForcePowers”声明这个事件)并且每个班级都会引发它各自的事件。

如果我有一个声明为“Jedi”类型的“Yoda”实例(如上),并且我在“Jedi”的“UsingForce”事件上放置了一个事件处理程序,然后在“Jedi”中调用“ForcePush”方法Yoda 的课程,会到达这个事件处理程序吗?

4

1 回答 1

3

在 VB.NET 中使用shadows关键字意味着您正在声明一个全新的成员,该成员存在于任何存在的继承层次结构之外。这就是为什么该关键字(以及相关的做法)通常被认为是“臭”的原因(尽管有些人反对这个特定的术语,但我觉得它很合适)。这种“遮遮掩掩”模式背后的原因是什么?这种方法通常保留在没有其他方法可以完成您需要的情况的情况下。继承和覆盖方法不是一种选择吗?

无论如何,如果您在较低的类中“隐藏”事件,那么不,继承链更远的类不可能直接触发事件,因为他们甚至不知道它存在。

于 2009-09-08T03:01:57.067 回答