簡體   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