C# C语言中的重写方法#

C# C语言中的重写方法#,c#,.net,.net-core,methods,overriding,C#,.net,.net Core,Methods,Overriding,在学习了整整一个学期的Java之后,我现在正在自学C# java(或一般的面向对象编程)的一个特性是能够重写继承到子类中的方法 当我在C#中研究这个特性时,我试图自己重写一个方法,但没有研究重写C#中方法的正确方法,而且它似乎起了作用 但是,经过进一步研究,我了解到在超类中声明方法时需要使用关键字virtual,在子类中重写方法时需要使用关键字override 所以我的问题是:在C#中重写方法的正确方法是什么 附加说明:我还想知道同样的情况是否适用于C#中的重载方法。以下内容摘自Wikipedi

在学习了整整一个学期的Java之后,我现在正在自学C#

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

当我在C#中研究这个特性时,我试图自己重写一个方法,但没有研究重写C#中方法的正确方法,而且它似乎起了作用

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

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


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

以下内容摘自Wikipedia(请参见,C#部分)

“C#确实支持方法重写,但仅当使用修饰符
override
virtual
abstract
*)明确请求时才支持方法重写。”

当用另一个方法重写一个方法时,两个方法的签名必须相同(并且具有相同的可见性)。在C#中,类方法、索引器、属性和事件都可以被重写。”



*)正如正确提到的,Wikipedia页面有一个错误,所以我稍微更改了答案(在上面添加了粗体文本)

以下内容摘自Wikipedia(请参见,C部分)

“C#确实支持方法重写,但仅当使用修饰符
override
virtual
abstract
*)明确请求时才支持方法重写。”

当用另一个方法重写一个方法时,两个方法的签名必须相同(并且具有相同的可见性)。在C#中,类方法、索引器、属性和事件都可以被重写。”



*)正如正确提到的,Wikipedia页面有一个错误,因此我稍微更改了答案(在上面添加了粗体文本)

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

  • 确实提供了一个默认实现
  • 只声明必须从继承该类的类重写的内容。它只能在
    抽象类中使用
还有其他与继承相关的关键字,如:

  • 声明类是final的,它不能被继承
  • 它表示元素正在重写父级
    抽象
    虚拟
    元素
例如:

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"; }
}

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

  • 确实提供了一个默认实现
  • 只声明必须从继承该类的类重写的内容。它只能在
    抽象类中使用
还有其他与继承相关的关键字,如:

  • 声明类是final的,它不能被继承
  • 它表示元素正在重写父级
    抽象
    虚拟
    元素
例如:

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"; }
}

virtual
关键字表示“这是一个可以覆盖的默认实现”。
abstract
关键字表示“必须始终覆盖此项”。由于明显的原因,如果类不是
abstract
,则不能使用
abstract
。正确的方法取决于你需要什么。关于Stackoverflow,我找不到一个直接的问题,我正要回答。@CodeNameJack,他们都没有投过票。我猜大多数问题都会得到链接到microsoft语言参考的注释。我建议检查并查看其限制,这将为您提供一个关于如何/何时覆盖的良好基础。我建议-关于如何覆盖的所有内容都在此处说明了
virtual
关键字的意思“这是一个可以重写的默认实现。”
abstract
关键字的意思是“必须始终重写它”“。显然,如果类不是
抽象
,则不能使用
抽象
。正确的方法取决于你需要什么。关于Stackoverflow,我找不到一个直接的问题,我正要回答。@CodeNameJack,他们都没有投过票。我猜大多数问题都会得到链接到microsoft语言参考的注释。我建议检查并查看其限制,这将为您提供一个关于如何/何时覆盖的良好基础。我建议-关于如何覆盖的所有内容都被认为维基引用是错误的。的确,它必须明确声明,但它应该是“和
虚拟的
抽象的
”。实际上,它缺少
摘要
关键字。我建议您编辑维基和您的答案,或者更改指向MS reference的链接。@bradbury9-谢谢您的提示,您完全正确。我改变了答案,加了一个脚注。另外,我更新了维基百科的文本。维基百科的引用是错误的。的确,它必须明确声明,但它应该是“和
虚拟的
抽象的
”。实际上,它缺少
摘要
关键字。我建议您编辑维基和您的答案,或者更改指向MS reference的链接。@bradbury9-谢谢您的提示,您完全正确。我改变了答案,加了一个脚注。此外,我还更新了维基百科文本。