位置:首頁(yè) > 軟件操作教程 > 編程開(kāi)發(fā) > C# > 問(wèn)題詳情

C# 隱藏基類方法

提問(wèn)人:劉團(tuán)圓發(fā)布時(shí)間:2020-12-07

    當(dāng)從基類繼承一個(gè)(非抽象的)成員時(shí),也就繼承了其實(shí)現(xiàn)代碼。如果繼承的成員是虛擬的,就可以用override關(guān)鍵字重寫(xiě)這段實(shí)現(xiàn)代碼。無(wú)論繼承的成員是否為虛擬,都可以隱藏這些實(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è)警告,說(shuō)明隱藏了一個(gè)基類成員。如果是無(wú)意間隱藏了—個(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)注意隱藏基類成員和重寫(xiě)它們的區(qū)別??紤]下面的代碼:

public class MyBaseClass

{

    public virtual void DoSomething() => WriteLine("Base imp");

}

public class MyDerivedClass : MyBaseClass

{

    public override void DoSomething() => WriteLine("Derived imp");

}

其中重寫(xiě)方法將替換基類中的實(shí)現(xiàn)代碼,這樣,下面的代碼就將使用新版本,即使這是通過(guò)基類類型進(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)代碼,但仍可以通過(guò)基類訪問(wèn)它。

繼續(xù)查找其他問(wèn)題的答案?

相關(guān)視頻回答
回復(fù)(0)
返回頂部