多态性/重写

Dot*_*NET 5 .net c# oop polymorphism inheritance

有人可以解释这两个例子之间的区别吗?

A级

protected virtual string GetData()

B级

private override string GetData()

以下内容:

A级

protected string GetData()

B级

private string GetData()

假设'B类'继承自'A类'.

我总是假设您需要virtual在超类和override子类中使用,如果您想要覆盖一个方法,但是我尝试删除关键字并编译好的程序.究竟有什么区别,如果有的话?

Aid*_*api 5

您显示的第二个示例隐藏了父级的GetData,它不会覆盖它。

例:

private class Base
{
    public virtual void Test()
    {
        Console.WriteLine("Base");
    }

    public void Test2()
    {
        Console.WriteLine("Base");
    }
}

private class Derived : Base
{
    public override void Test()
    {
        Console.WriteLine("Derived");
    }

    public void Test2()
    {
        Console.WriteLine("Derived");
    }
}

static void Main()
{
    Base b = new Base();
    Derived d = new Derived();
    Base dInB = new Derived();

    b.Test();
    d.Test();
    dInB.Test();

    b.Test2();
    d.Test2();
    dInB.Test2();

    Console.ReadKey(true);
}
Run Code Online (Sandbox Code Playgroud)

它输出:

Base    // Base.Test()
Derived // Derived.Test()
Derived // Derived.Test()
Base    // Base.Test2()
Derived // Derived.Test2()
Base    // You think you're calling Derived.Test2(), but you actually call Base.Test2()
Run Code Online (Sandbox Code Playgroud)

实际上,此示例是无效的,因为它应该在Derived类中使用new关键字in public new void Test2()

就像操作符重载一样。它实际上并没有覆盖任何内容。当您拥有确切的类型时,Derived它将调用新方法。

您必须非常小心隐藏成员,这根本不像重写(类)或实现(接口)。只有当您拥有 确切的类型时,它才会调用 new 方法,否则它将仍然调用基本类型的方法!