【问题标题】:If methods are neither virtual nor sealed by default, then why does this method override of a non-virtual and non-sealed method work?如果默认情况下方法既不是虚拟的也不是密封的,那么为什么这个方法覆盖了非虚拟和非密封的方法?
【发布时间】:2022-09-25 23:59:22
【问题描述】:

有好几次,我被告知 C# 类中的方法在默认情况下既不是密封的也不是虚拟的。尽管如此,下面的代码工作得很好,并打印了两个明确预期的字符串。这是我很困惑的有力证据。我不知道什么默认值或功能?

Child ExampleChild = new Child();
ExampleChild.SayHello();
Parent ExampleParent = new Parent();
ExampleParent.SayHello();

public class Parent
{
    public void SayHello() => Console.WriteLine(\"Hello from parent\");
}
public class Child : Parent
{
    public void SayHello() => Console.WriteLine(\"Hello from child\");
}

    标签: c# inheritance methods


    【解决方案1】:

    您正在定义一个新方法 (Child.SayHello()),它隐藏了父方法。有一个编译器警告告诉你。

    理想情况下,新方法应标有new,以明确意图。它不会参与动态调度,即如果你有一个Parent 类型的变量,那么Parent.SayHello() 将被调用。

    【讨论】:

    • 那么,什么是方法的默认关键字呢?好像有一些我从未听说过的hideable 关键字。
    猜你喜欢
    • 2019-09-24
    • 1970-01-01
    • 2010-11-01
    • 1970-01-01
    • 2012-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-28
    相关资源
    最近更新 更多