簡體   English   中英

新的關鍵字和方法隱藏

[英]new Keyword and Method Hiding

新的關鍵字用於隱藏相同的基類實現。 但我不確定為什么以下代碼將輸出生成為Baseclass

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(); 
        d.fun(); 
    } 
} 

我們在derived2中隱藏了fun的實現但是仍然調用Base類為什么呢? 我錯過了什么嗎?

Derived2.fun是私有的(它是該類型成員的默認訪問修飾符)。 在課堂外不可見。 只有類外的可見fun方法是Baseclass.fun ,因此它被調用。

您需要在類外部顯示Derived2.fun以獲得預期的輸出。 你可以通過公開/內部來做到這一點。

通常,隱藏在C#中的工作原理如下:“hider”(一個方法或字段或用new關鍵字聲明的任何東西)接管它可以從“隱藏”的任何“功能”。 例如:

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

在這里, funDerived1隱藏funBaseclass完全的,因為它們擁有完全相同的“功能”:他們是兩種方法,並且都是public的,即可以從任何地方。

但是,如果“hider”沒有覆蓋所有“隱藏”成員的功能,它仍然會在那里,准備好完成它的工作。 例:

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

這里, Baseclass.fun是一個方法, Derived1.fun是一個字段。

您可以訪問賦值表達式中的“隱藏”字段,如下所示: int a = new Derived1().fun; 因為它隱藏了基類方法的fun ,所以你不能以這種方式訪問​​它(方法): System.Action a = new Derived1().fun; 失敗。

但是,如果我們做一些事情會發生什么fun ,一個int字段不能做? new Derived1().fun(); 會工作,在基類中調用fun

在MSDN上的新修改器頁面上甚至提到了這個具體的例子:

通常,在類或結構中引入的常量,字段,屬性或類型會隱藏共享其名稱的所有基類成員。 有特殊情況。 例如,如果聲明名為N的新字段具有不可調用的類型,並且基類型將N聲明為方法,則新字段不會隱藏調用語法中的基本聲明。

你的情況非常相似。 兩個派生類中的fun方法只是隱藏了基類中原始fun一部分。 如果你從Derived1Derived2內部調用fun ,你將得到相應類的foo的“hider”版本。 但是,當您從三個類之外調用foo時,會調用Baseclasspublic方法,因為它的public功能尚未被隱藏...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM