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子类中使用,如果您想要覆盖一个方法,但是我尝试删除关键字并编译好的程序.究竟有什么区别,如果有的话?
您显示的第二个示例隐藏了父级的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 方法,否则它将仍然调用基本类型的方法!