我学习了整个学期的Java之后,目前正在自学C#。
java(或一般的面向对象编程)的功能之一是能够重写继承到子类中的方法。
当我在 C# 中研究这个功能时,我尝试自己重写一个方法,而没有研究在 C# 中重写方法的正确方法,看起来似乎有效。
但是,经过进一步研究,我了解到在超类中声明方法时需要使用关键字
virtual
,在子类中重写方法时需要使用override
。
所以我的问题是:
在 C# 中重写方法的正确方法是什么?
附加说明:我还想知道同样的情况是否适用于 C# 中的重载方法。
.net 中有两种不同的重写方法,具体取决于您是否想提供默认实现。
abstract
类中使用。
abstract
或
virtual
元素。
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"; }
}
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正确提到的,维基百科页面有错误,所以我稍微改变了答案(在上面添加了粗体文本)