这是Micosoft对new
关键字的定义:“警告说DerivedClass中的Method2 方法 隐藏 BaseClass中的Method2 方法< / strong>。”
(https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/knowing-when-to-use-override-and-new-keywords)
我似乎无法确定为什么将其定义为“隐藏基类的实现”。如果它实际上“隐藏”了基类的实现,为什么它使用基类的实现而不是派生类的实现?在我看来,“隐藏”一词的使用与它的实际工作相矛盾,并且解释倾向于关键字override
的实际作用。使用派生类的实现而不是基类的实现。
我希望通过使用new
关键字来消除我对这种“基类实现隐藏”的困惑,因为任何答案都可以解决。谢谢大家!
答案 0 :(得分:1)
为什么它使用基类的实现而不是派生类的实现
对于'new',当在基类变量上调用时,它将调用基类的实现。 在派生类变量上调用时,它将调用派生类的实现。
Derived d = new Derived();
Base b = d;
d.Foo(); //<- Derived's implementation
b.Foo(); //<- Base's implementation
通过'override',在两种情况下都将调用派生类的实现。
Derived d = new Derived();
Base b = d;
d.Foo(); //<- Derived's implementation
b.Foo(); //<- Derived's implementation
答案 1 :(得分:0)
我会这样考虑:
当class DelegatedLoanContract:
... # your code here
def __iadd__(self, other):
self._contract += other
return self
if __name__ == '__main__':
loan_contract = DelegatedLoanContract('Alan', 'John')
loan_contract += 'Signee_1 will load 2,000 EUR to Signee_2.'
print(loan_contract._contract.contract_rules)
# prints ['Signee_1 will load 2,000 EUR to Signee_2.']
隐藏基类public double findProduct(int limit) {
double product = 1;
for(int n = 3; n < limit; n = n + 3) {
if (n%5 != 0)
{
product = product * n;
}
}
return product;
}
的成员并且您通过Derived
访问时,Base
s被调用,因为它隐藏了Derived
s实施。但是,当通过Derived
时,没有什么隐藏它,因此使用Base
的实现。
但是,Base
(多态性)Base
的方法实际上是被覆盖而不是隐藏的,因此即使通过virtual/override
引用进行访问,它也将使用Base
s的方法
也(也许是真正的原因):给事物命名很难。程序员和其他人一样在这方面都很糟糕。