【问题标题】:Using shadowed methods/fields in an overriden method在覆盖方法中使用阴影方法/字段
【发布时间】:2015-05-19 10:17:15
【问题描述】:

假设我有以下代码:

Class NormalEmployee
     Protected pay As Decimal;
     Protected Shared basePay As Decimal = 300D
     Protected Overridable Sub UpdatePay()
         pay = basePay + .....do something......
     End Sub
End Class

Class SeniorNormalEmployee
  Inherits Normal Employee
    Protected Shared Shadows basePay As Decimal = 500D;
    Protected Overrides Sub UpdatePay()
         pay = basePay + .....do something different....
    End Sub
End Class

Function Main() As Integer
    Dim newEmployee As NormalEmployee = New SeniorNormalEmployee()
    newEmployee.CalculatePay()
    return 0
End Function

我知道由于多态性,我的基类中的 CalculatePay() 将被调用。我的问题是:为什么 CalculatePay() 使用基类中的 basePay 而不是派生类?该对象存储在基类“容器”中,因此即使它使用方法的派生类版本,当它检查 basePay 时,它不应该查看基类的版本吗?

此外,从覆盖方法调用阴影方法时,这种行为是否相同?有什么方法可以使字段“可覆盖”?

感谢您的帮助!

【问题讨论】:

  • 我还应该补充一点,我知道程序设计并不出色,但是由于分配要求,这是我坚持的设计。另外,我只是把这段代码作为一个简短的例子,所以如果有任何错误或缺少语法,我深表歉意。

标签: vb.net oop


【解决方案1】:

问题在于,当您引用基类时,使用Shadows 关键字会使您的代码使用基类的变量。由于您使用了多态性并且您的newEmployee 被定义为NormalEmployee,因此basepay 是基类之一。欲了解更多信息,请查看here

【讨论】:

  • 这是我认为会发生的事情,但这不是我的代码中发生的事情。尽管我的newEmployee 被定义为NormalEmployee 并使用SeniorNormalEmployeeCalculatePay() 版本,但它使用派生 类的basePay。这对我来说似乎很不正常,因为newEmployeeNormalEmployee 类型,所以即使由于多态性它使用派生类的方法,我认为它会使用基类的basePay 版本,但事实并非如此。
  • 我的预感是,当多态性启动并确定对象应该使用派生类版本CalculatePay() 时,它会隐式地将对象强制转换为派生类型,如果派生类就必须这样做CalculatePay() 使用了派生类型独有的任何方法或字段。由于这种内部转换,派生类的basePay 被检索而不是基类的。
  • 您是否尝试过不为派生的 basePay 使用 Shadows 关键字?这样做的结果是什么?
  • 做同样的事情,Shadows 是默认行为,关键字只是向编译器指定您知道它正在发生,因此它不会在 IDE 中生成通知。
猜你喜欢
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
  • 2012-01-11
  • 2017-04-16
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多