C#“新”关键字

时间:2019-03-15 20:35:55

标签: c# inheritance polymorphism keyword

这是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关键字来消除我对这种“基类实现隐藏”的困惑,因为任何答案都可以解决。谢谢大家!

2 个答案:

答案 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的方法

也(也许是真正的原因):给事物命名很难。程序员和其他人一样在这方面都很糟糕。