如何访问 Derived 1 和 Derived 2 中的结果而不是基础 class

How can I access the result in Derived 1 and Derived 2 and not the base class

class Baseclass
{
    public void fun()
    {
        Console.Write("Base class" + " ");
    }
}
class Derived1 : Baseclass
{
    new void fun()
    {
        Console.Write("Derived1 class" + " ");
    }
}
class Derived2 : Derived1
{
    new void fun()
    {
        Console.Write("Derived2 class" + " ");
    }
}
class Program
{
    public static void Main(string[] args)
    {
        Derived2 d = new Derived2();

        Derived1 e = new Derived1();
        d.fun();
        e.fun();
    }
}

如何访问 Derived 1 和 Derived 2 中的结果而不是基数 class 这是重载还是覆盖?

new 既不是重载也不是覆盖。它本质上说 'When I am called, and the object is cast as Derived1, then invoke this'。请注意,它是 对象被施放的时候,而不是对象与之交互的时候。

如果您将方法标记为 public,您的代码将 看起来 可以工作。例如:

class Derived1 : Baseclass
{
    public new void fun()
    {
        Console.Write("Derived1 class" + " ");
    }
}
class Derived2 : Derived1
{
    public new void fun()
    {
        Console.Write("Derived2 class" + " ");
    }
}

将打印

Derived2 class Derived1 class

但是,将您的代码更改为以下内容将揭示 new 在这种情况下的问题:

void Main()
{
    Derived2 d = new Derived2();

    Derived1 e = new Derived1();
    ExecuteIt(d);
    ExecuteIt(e);
}

void ExecuteIt(Baseclass obj)
{
    obj.fun();
}

打印

Base class Base class

由于对象被转换为Baseclass,因此隐藏不生效。要正确实现覆盖,您需要执行以下操作:

class Baseclass
{
    public virtual void fun()
    //     ^^^^^^^
    {
        Console.Write("Base class" + " ");
    }
}
class Derived1 : Baseclass
{
    public override void fun()
//  ^^^^^^ ^^^^^^^^
    {
        Console.Write("Derived1 class" + " ");
    }
}
class Derived2 : Derived1
{
    public override void fun()
//  ^^^^^^ ^^^^^^^^
    {
        Console.Write("Derived2 class" + " ");
    }
}

其中,当 运行 具有:

void Main()
{
    Derived2 d = new Derived2();

    Derived1 e = new Derived1();
    ExecuteIt(d);
    ExecuteIt(e);
}

void ExecuteIt(Baseclass obj)
{
    obj.fun();
}

正确输出

Derived2 class Derived1 class