[英]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" + " ");
}
}
在這里, fun
在Derived1
隱藏fun
在Baseclass
完全的,因為它們擁有完全相同的“功能”:他們是兩種方法,並且都是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
一部分。 如果你從Derived1
或Derived2
內部調用fun
,你將得到相應類的foo
的“hider”版本。 但是,當您從三個類之外調用foo
時,會調用Baseclass
的public
方法,因為它的public
功能尚未被隱藏...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.