C# 中的重写方法

问题描述 投票:0回答:2

我学习了整个学期的Java之后,目前正在自学C#。

java(或一般的面向对象编程)的功能之一是能够重写继承到子类中的方法。

当我在 C# 中研究这个功能时,我尝试自己重写一个方法,而没有研究在 C# 中重写方法的正确方法,看起来似乎有效。

但是,经过进一步研究,我了解到在超类中声明方法时需要使用关键字

virtual
,在子类中重写方法时需要使用
override

所以我的问题是:
在 C# 中重写方法的正确方法是什么?

附加说明:我还想知道同样的情况是否适用于 C# 中的重载方法。

c# .net .net-core methods overriding
2个回答
4
投票

.net 中有两种不同的重写方法,具体取决于您是否想提供默认实现。

还有其他与继承相关的关键字,例如:

示例:

public abstract class Bank { public abstract string Country { get; } // Everything inheriting must implement it public virtual decimal TaxPercent { get { return 0.25; } } // Implementing it is optional public decimal DeclareTaxes() { decimal taxesToPay = 4000 * TaxPercent; return taxesToPay; } } public sealed class BahamasBank: Bank { public override string Country { get { return "Bahamas"; } public override TaxPercent { get { return 0.0; } } // Bahamas is different from most countries in tax related stuff } public sealed class CanadaBank: Bank { public override string Country { get { return "Canada"; } }
    

1
投票
以下内容摘自维基百科(请参阅

此处,C# 部分)。

“C# 确实支持方法重写,但前提是使用修饰符

override

virtual
abstract
 明确请求。
*)

abstract class Animal { public String Name {get; set; } // Methods public void Drink() { } public virtual void Eat() { } public abstract void Go(); } class Cat : Animal { public new String Name {get; set; } // Methods public void Drink() { } // warning: hides inherited drink(). Use new public override void Eat() { } // overrides inherited eat(). public new void Go() { } // hides inherited abstract go(). }
当用另一种方法覆盖一种方法时,两种方法的签名必须相同(并且具有相同的可见性)。在 C# 中,类方法、索引器、属性和事件都可以被重写。”

请注意,在上面的示例中,对于每个未标记的抽象、外部或部分函数,您需要声明一个主体(请参阅 CS0501 编译器消息)。如果使用

Go()

 方法,您也可以使用 
override
 而不是 
new


*) 正如bradbury9正确提到的,维基百科页面有错误,所以我稍微改变了答案(在上面添加了粗体文本)

© www.soinside.com 2019 - 2024. All rights reserved.