在VB.NET中有一个关键字'shadows'。假设我有一个名为'Jedi'的基类和一个名为'Yoda'的派生类,它继承自'Jedi'。如果我在'Jedi'中声明了一个名为'ForcePush'的方法,并在'Yoda'中声明了阴影,那么当在'Yoda'类的实例上调用该方法时,它将忽略基类实现并使用派生类的实现。但是,如果我有一个'Yoda'实例,它最初被声明为'Jedi'类型,即Dim j as Jedi = new Yoda()
,并在实例上调用'ForcePush'方法,它将使用Jedi实现。
现在假设我有一个名为'UsingForce'的事件,当调用'ForcePush'方法时会引发该事件,并且我在派生类中影响事件(这是因为'Yoda'有一个接口'IForcePowers '宣布这个事件),每个班级都会举起各自的活动。
如果我有一个'Yoda'实例被声明为'Jedi'类型(如上所述)并且我在'Jedi'的'UsingForce'事件上放了一个事件处理程序,然后调用'ForcePush'方法在'Yoda'课程中,是否会触及此事件处理程序?
答案 0 :(得分:2)
在VB.NET中使用shadows
关键字意味着您声明一个存在于任何继承层次之外的全新成员。这就是为什么关键词(和相关的练习)通常被认为是“臭”(虽然有些人反对这个特定的术语,我觉得它很合适)。这种“遮蔽事物”模式背后的原因是什么?这种方法通常用于没有其他方法可以完成所需的情况。继承和覆盖方法不是一种选择吗?
无论如何,如果你在较低的类中“遮蔽”事件,那么不,没有可能的方法让继承链的一个类更直接地触发事件,因为他们甚至不知道它存在。