C# C语言中的重写方法#
在学习了整整一个学期的Java之后,我现在正在自学C# java(或一般的面向对象编程)的一个特性是能够重写继承到子类中的方法 当我在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
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-谢谢您的提示,您完全正确。我改变了答案,加了一个脚注。此外,我还更新了维基百科文本。