c# - C#中的重写方法
问题描述
在学习了整个学期的 Java 之后,我目前正在自学 C#。
java(或一般的面向对象编程)的特性之一是能够覆盖继承到子类中的方法。
当我在 C# 中研究此功能时,我试图自己覆盖一个方法,而没有研究在 C# 中覆盖方法的正确方法,它似乎有效。
virtual
但是,经过进一步研究,我了解到在声明超类中的override
方法和覆盖子类中的方法时,我们需要使用关键字。
所以我的问题是:
在 C# 中覆盖方法的正确方法是什么?
附加说明:我还想知道同样的情况是否适用于 C# 中的重载方法。
解决方案
根据您是否要提供默认实现,在 .net 中有两种不同的覆盖方式。
- virtual 关键字确实提供了默认实现。
- abstract 关键字仅声明必须从继承该类的那些类中重写的内容。它只能在
abstract
类内部使用。
还有其他与继承相关的关键字,例如:
- sealed 关键字表示类是最终的,它不能被继承。
- override 关键字它表示该元素正在覆盖父元素
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"; }
}
推荐阅读
- javascript - JavaScript 只调用标头
- ibm-cloud - 如何将 IBM Watson Assistant 聊天机器人嵌入另一个 HTML 页面
- apache-spark - Spark SQL 中的 Sort by 与数据集 API 的排序与 Spark SQL 中的 Order by 有什么区别?
- word2vec - word2vec 词汇表中缺少单词
- xamarin - 使用 IdentityServer4 和 Xamarin Android 使用资源所有者密码进行脱机访问和刷新令牌
- sql - 从日期 SQL 返回按年和月分组的所有行
- python - 在 Python-Django 项目中将 XML 值呈现为 HTML
- c - C、没有malloc的fork上泄漏
- node.js - 为什么 Angular 需要 Node Js?Angular Cli 的作用是什么?
- uwp - 从 UWP 应用程序 C# 项目调用 wrt/c++ Windows 运行时组件时出现 InvalidCastException