C# 隱藏基類方法
當(dāng)從基類繼承一個(gè)(非抽象的)成員時(shí),也就繼承了其實(shí)現(xiàn)代碼。如果繼承的成員是虛擬的,就可以用override關(guān)鍵字重寫這段實(shí)現(xiàn)代碼。無論繼承的成員是否為虛擬,都可以隱藏這些實(shí)現(xiàn)代碼。這是很有用的,例如,當(dāng)繼承的公共成員不像預(yù)期的那樣工作時(shí),就可以隱藏它。
使用下面的代碼就可以隱藏:
public class MyBaseClass
{
public void DoSomething()
{
// Base implementation.
}
}
public class MyDerivedClass : MyBaseClass
{
public void DoSomething()
{
// Derived class incrementation, hides base implementation.
}
}
盡管這段代碼可以正常運(yùn)行,但它會(huì)生成一個(gè)警告,說明隱藏了一個(gè)基類成員。如果是無意間隱藏了—個(gè)需要使用的成員,此時(shí)就可以改正錯(cuò)誤。如果確實(shí)要隱藏該成員,就可以使用new關(guān)鍵字顯式地表明意圖:
public class MyDerivedClass : MyBaseClass
{
new public void DoSomething()
{
// Derived class implementation, hides base implementation.
}
}
其工作方式是完全相同的,但不會(huì)顯示警告。此時(shí)應(yīng)注意隱藏基類成員和重寫它們的區(qū)別??紤]下面的代碼:
public class MyBaseClass
{
public virtual void DoSomething() => WriteLine("Base imp");
}
public class MyDerivedClass : MyBaseClass
{
public override void DoSomething() => WriteLine("Derived imp");
}
其中重寫方法將替換基類中的實(shí)現(xiàn)代碼,這樣,下面的代碼就將使用新版本,即使這是通過基類類型進(jìn)行的,情況也同樣如此(使用多態(tài)性):
MyDerivedClass myObj = new MyDerivedClass();
MyBaseClass myBaseObj;
myBaseObj = myObj;
myBaseObj.DoSomething();
結(jié)果如下:
Derived imp
另外,還可以使用下面的代碼隱藏基類方法:
public class MyBaseClass
{
public virtual void DoSomething() => WriteLine("Base imp">;
}
public class MyDerivedClass : MyBaseClass
{
new public void DoSomething() => WriteLine("Derived imp");
}
基類方法不必是虛擬的,但結(jié)果是一樣的,只需要修改上面代碼中的一行即可。對(duì)于基類的虛擬方法和非虛擬方法而言,其結(jié)果如下:
Base imp
盡管隱藏了基類的實(shí)現(xiàn)代碼,但仍可以通過基類訪問它。
點(diǎn)擊加載更多評(píng)論>>