gpt4 book ai didi

c# - 多态/覆盖

转载 作者:太空狗 更新时间:2023-10-29 22:53:50 27 4
gpt4 key购买 nike

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

Class A

protected virtual string GetData()

Class B

private override string GetData()

以及以下内容:

Class A

protected string GetData()

Class B

private string GetData()

假设“B 类”继承自“A 类”。

我一直假设你需要在父类(super class)中使用 virtual 并在子类中使用 override 如果你想覆盖一个方法,但是我尝试删除关键字和程序编译正常。如果有的话,到底有什么区别?

最佳答案

您展示的第二个示例隐藏了父级的 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);
}

输出:

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()

实际上这个示例是无效的,因为它应该在派生类的public new void Test2()中使用new关键字。

它就像运算符重载一样工作。它实际上并没有覆盖任何东西。当您具有确切类型 Derived 时,它会调用新方法。

您必须非常小心地隐藏成员,这与覆盖(类)或实现(接口(interface))完全不同。只有当您拥有 精确类型时,它才会调用一个 方法,否则它仍然会调用基类型的方法!

关于c# - 多态/覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8828241/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com