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