c# - C# 中的重写关键字

标签 c#

我有以下类(class):

namespace ConsoleApplication8
{
    public abstract class Employee
    {
        public virtual void Show()
        {
            Console.WriteLine("from base.");
        }
    }

    public class Manager:Employee 
    {
        public void Show()
        {

            Console.WriteLine("from child.");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var man=new Manager();
            man.Show();
            Console.ReadKey();
        }
    }
}

在这里,我没有为派生类 Manager 中的方法 Show() 使用任何 override 关键字,但代码运行正常.那么override关键字的实际用途是什么。

最佳答案

你没有覆盖原来的方法,你是hiding它。这也是可能的,但可能不是你想要的或你期望的,因为你失去了 polymorphism .我举个例子:

static void Main(string[] args)
{
    var man=new Manager();
    man.Show();
    Console.ReadKey();
}

这是您的代码并输出“From child”。下面,当使用“override”时,也会输出“From child”。在你的情况下它不会。

static void Main(string[] args)
{
    var man=new Manager();
    (man as Employee).Show();
    Console.ReadKey();
}

此处提出了类似的问题:virtual keyword in c# .虽然它没有解决 override关键字,问题类差不多。


多态性何时有用的真实例子。我必须编写一个应用程序来计算公司中所有 员工的奖金,基于他们的角色。和你一样,我有一个员工类(class) public virtual double CalculateBonus();方法和从中派生的几个类。

多亏了多态性,我所要做的就是迭代 List<Employee>所有员工,无论其角色如何,请调用 CalculateBonus方法,因为多态性确保始终调用覆盖。

如果没有覆盖,奖金将全部为 0,因为这是 CalculateBonus 的默认结果在类里面Employee .

关于c# - C# 中的重写关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29406619/

相关文章:

c# - 如何以编程方式连接到 VPN?

c# - 解析字符串中的名称

c# - 从 Regex 读取捕获组也是 URL 重写规则?可能的?

c# - 消息实体未找到异常 : The messaging entity 'ihsuprodsgres029dednamespace:eventhub:' could not be found

c# - OxyPlot 获取点击点

c# - WPF 如何使用数据触发器为 listboxitem 中的图片设置动画?

c# - Visual Studio 后期生成事件命令行 "for"语法

C# Selenium ChromeDriver 无效的 --log-level 值。无法初始化日志记录

c# - Unity Dropdown 从数据库中添加值

c# - multi.Read 的输出参数始终为 null