gpt4 book ai didi

c# - 没有虚拟和覆盖的功能覆盖

转载 作者:太空宇宙 更新时间:2023-11-03 17:50:51 25 4
gpt4 key购买 nike

我只有一个基本问题:

public class virtualTest
{
public virtual void vTest()
{
Console.WriteLine("Base Class");
}
}

public class derivedVirtualTest : virtualTest
{
public override void vTest()
{
Console.WriteLine("Derived Class");
}
}

这里我使用函数 vTest() 覆盖函数

但是如果我:

public class virtualTest
{
public void vTest()
{
Console.WriteLine("Base Class");
}
}

public class derivedVirtualTest : virtualTest
{
public void vTest()
{
Console.WriteLine("Derived Class");
}
}

从各自的地方删除虚拟和覆盖关键字,然后代码也可以工作。

这怎么可能?

或者如果代码在没有虚拟和覆盖的情况下工作正常,那么覆盖和虚拟(整个函数覆盖)的用途是什么???

编辑:

我调用上面类的方法

 static void Main(string[] args)
{



derivedVirtualTest objderivedVirtualTest = new derivedVirtualTest();
objderivedVirtualTest.vTest();

virtualTest objvirtualTest = new virtualTest();
objvirtualTest.vTest();

Console.ReadLine();


}

最佳答案

正如 qwr 所解释的,OOP 方面的主要区别在于多态性。这意味着如果您通过基类型引用访问覆盖基成员的类,您对可覆盖成员执行的调用将重定向到覆盖。

对于隐藏/隐藏基成员的类,调用不会被重定向,基类的方法正在执行。

所以,给定:

class Base
{
public virtual void OverrideMe()
{
Console.WriteLine("I'm the base");
}
}

class Derived : Base
{
public override void OverrideMe()
{
Console.WriteLine("I'm derived");
}
}

class Shadowing : Base
{
public void OverrideMe()
{
Console.WriteLine("I'm shadowing");
}
}

并以这种方式使用它们:

var instances = new Base[] {new Base(), new Derived(), new Shadowing()};

foreach (var instance in instances)
{
instance.OverrideMe();
}

将产生:

我是基地

我是派生的

我是基地

另外的区别是,在覆盖的情况下,您可以改进您的基类,例如更改基类成员的签名或完全删除它,而不更改隐藏的成员。在某些情况下,这可能完全适合需要,而在某些情况下 - 不是那么多。

在覆盖的情况下,您必须同时更改覆盖成员的签名,否则您的代码将无法编译。

关于c# - 没有虚拟和覆盖的功能覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26751134/

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