国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

深入剖析C#繼承機制4

2024-07-21 02:18:13
字體:
來源:轉載
供稿:網友
2) 隱藏基類成員

  想想看,如果所有的類都可以被繼承,繼承的濫用會帶來什么后果?類的層次結構體系將變得十分龐,大類之間的關系雜亂無章,對類的理解和使用都會變得十分困難。有時候,我們并不希望自己編寫的類被繼承。另一些時候,有的類已經沒有再被繼承的必要。c#提出了一個密封類(sealed class)的概念,幫助開發人員來解決這一問題。

  密封類在聲明中使用sealed 修飾符,這樣就可以防止該類被其它類繼承。如果試圖將一個密封類作為其它類的基類,c#將提示出錯。理所當然,密封類不能同時又是抽象類,因為抽象總是希望被繼承的。

  在哪些場合下使用密封類呢?密封類可以阻止其它程序員在無意中繼承該類。而且密封類可以起到運行時優化的效果。實際上,密封類中不可能有派生類。如果密封類實例中存在虛成員函數,該成員函數可以轉化為非虛的,函數修飾符virtual 不再生效。

  讓我們看下面的例子:


bstract class a
{
public abstract void f( ) ;
}
sealed class b: a
{
public override void f( )
{ // f 的具體實現代碼 }
}

  如果我們嘗試寫下面的代碼

class c: b{ }

  c#會指出這個錯誤,告訴你b 是一個密封類,不能試圖從b 中派生任何類。

  (3) 密封方法

  我們已經知道,使用密封類可以防止對類的繼承。c#還提出了密封方法(sealedmethod) 的概念,以防止在方法所在類的派生類中對該方法的重載。對方法可以使用sealed 修飾符,這時我們稱該方法是一個密封方法。

  不是類的每個成員方法都可以作為密封方法密封方法,必須對基類的虛方法進行重載,提供具體的實現方法。所以,在方法的聲明中,sealed 修飾符總是和override 修飾符同時使用。請看下面的例子代碼:


using system ;
class a
{
public virtual void f( )
{ console.writeline("a.f") ; }
public virtual void g( )
{ console.writeline("a.g") ; }
}
class b: a
{
sealed override public void f( )
{ console.writeline("b.f") ; }
override public void g( )
{ console.writeline("b.g") ; }
}
class c: b
{
override public void g( )
{ console.writeline("c.g") ; }
}

  類b 對基類a 中的兩個虛方法均進行了重載,其中f 方法使用了sealed 修飾符,成為一個密封方法。g 方法不是密封方法,所以在b 的派生類c 中,可以重載方法g,但不能重載方法f。

  (4) 使用 new 修飾符隱藏基類成員

  使用 new 修飾符可以顯式隱藏從基類繼承的成員。若要隱藏繼承的成員,請使用相同名稱在派生類中聲明該成員,并用 new 修飾符修飾它。

  請看下面的類:


public class mybase
{
public int x ;
public void myvoke() ;
}

  在派生類中用 myvoke名稱聲明成員會隱藏基類中的 myvoke方法,即:


public class myderived : mybase
{ new public void myvoke (); }

  但是,因為字段 x 不是通過類似名隱藏的,所以不會影響該字段。

  通過繼承隱藏名稱采用下列形式之一:

   a、引入類或結構中的常數、指定、屬性或類型隱藏具有相同名稱的所有基類成員。

   b、引入類或結構中的方法隱藏基類中具有相同名稱的屬性、字段和類型。同時也隱藏具有相同簽名的所有基類方法。

   c、引入類或結構中的索引器將隱藏具有相同名稱的所有基類索引器。

  注意:在同一成員上同時使用 new 和 override 是錯誤的。同時使用 new 和 virtual 可保證一個新的專用化點。在不隱藏繼承成員的聲明中使用 new 修飾符將發出警告。

  示例1:在該例中,基類 mybasec 和派生類 myderivedc 使用相同的字段名 x,從而隱藏了繼承字段的值。該例說明了 new 修飾符的使用。同時也說明了如何使用完全限定名訪問基類的隱藏成員。


using system ;
public class mybase
{
public static int x = 55 ;
public static int y = 22 ;
}
public class myderived : mybase
{
new public static int x = 100; // 利用new 隱藏基類的x
public static void main()
{
// 打印x:
console.writeline(x);
//訪問隱藏基類的 x:
console.writeline(mybase.x);
//打印不隱藏的y:
console.writeline(y);
}
}

  輸出: 100 55 22

  如果移除 new 修飾符,程序將繼續編譯和運行,但您會收到以下警告:

the keyword new is required on 'myderivedc.x' because it hides inherited member 'mybasec.x'.

  如果嵌套類型正在隱藏另一種類型,如下例所示,也可以使用 new 修飾符修改此嵌套類型。




商業源碼熱門下載www.html.org.cn

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 象州县| 博野县| 仁化县| 额济纳旗| 永年县| 江孜县| 九龙坡区| 朝阳区| 信阳市| 陆良县| 库车县| 阜平县| 泰来县| 望江县| 马鞍山市| 南澳县| 修水县| 大渡口区| 苍溪县| 涟水县| 左云县| 象州县| 巴彦淖尔市| 石屏县| 虹口区| 昌邑市| 安徽省| 平顺县| 鹤峰县| 汾西县| 福安市| 文山县| 奉化市| 项城市| 东兰县| 施秉县| 阳曲县| 铁力市| 沁源县| 府谷县| 凤山市|