繁体   English   中英

如何在派生1和派生2中而不是基类中访问结果

[英]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();
    }
}

如何在派生1和派生2中而不是基类中访问结果?这是重载还是重写?

new的既不是过载也不是重写。 本质上说:“当我被调用时, 对象被Derived1Derived1 ,然后调用它”。 请注意,这是在投射对象时 ,而不是在与该对象进行交互时。

如果您将方法标记为public ,那么您的代码似乎可以正常工作。 例如:

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

会打印

Derived2类Derived1类

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

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

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

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

版画

基类基类

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

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类Derived1类

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM