深入剖析C 繼承機制 6

2021-06-17 16:04:55 字數 2470 閱讀 9039

五、繼承與訪問修飾符

訪問修飾符是一些關鍵字,用於指定宣告的成員或型別的可訪問性。類的繼承中有四個訪問修飾符: public protected internal private。使用這些訪問修飾符可指定下列五個可訪問性級別: public protected internal internal protected private。

宣告的可訪問性

意義public

訪問不受限制。

protected

訪問僅限於包含類或從包含類派生的型別。

internal

訪問僅限於當前專案。

protected internal

訪問僅限於從包含類派生的當前專案或型別。

private

訪問僅限於包含型別。

1、繼承中關於可訪問域的一些問題

基類的所有成員(例項建構函式、析構函式和靜態建構函式除外)都由派生型別繼承。這甚至包括基類的私有成員。但是,私有成員的可訪問域只包括宣告該成員的型別的程式文字。在下面的示例中

class a

}class b: a }

類 b 繼承類 a 的私有成員 x。因為該成員是私有的,所以只能在 a 的"類體"中對它進行訪問。因此,對 b.x 的訪問在 a.f 方法中取得了成功,在 b.f 方法中卻失敗了。

2、繼承中關於屬性的一些問題

和類的成員方法一樣,我們也可以定義屬性的過載、虛屬性、抽象屬性以及密封屬性的概念。與類和方法一樣,屬性的修飾也應符合下列規則:

屬性的過載

1. 在派生類中使用修飾符的屬性,表示對基類中的同名屬性進行過載。

2. 在過載的宣告中,屬性的名稱、型別、訪問修飾符都應該與基類中被繼承的屬性一致。

3. 如果基類的屬性只有乙個屬性訪問器,過載後的屬性也應只有乙個。但如果基類的屬性同時包含get 和set 屬性訪問器,過載後的屬性可以只有乙個,也可以同時有兩個屬性訪問器。

注意:與方法過載不同的是,屬性的過載宣告實際上並沒有宣告新的屬性,而只是為已有的虛屬性提供訪問器的具體實現。

虛屬性1. 使用virtual 修飾符宣告的屬性為虛屬性。

2. 虛屬性的訪問器包括get 訪問器和set 訪問器,同樣也是虛的。

抽象屬性

1. 使用abstract 修飾符宣告的屬性為抽象屬性。

2. 抽象屬性的訪問器也是虛的,而且沒有提供訪問器的具體實現。這就要求在非虛的派生類中,由派生類自己通過過載屬性來提供對訪問器的具體實現。

3. abstract 和override 修飾符的同時使用,不但表示屬性是抽象的,。而且它過載了基類中的虛屬性這時屬性的訪問器也是抽象的。

4. 抽象屬性只允許在抽象類中宣告。

5. 除了同時使用abstract 和override 修飾符這種情況之外,static, virtual, override和abstract 修飾符中任意兩個不能再同時出現。

密封屬性

1. 使用sealed 修飾符宣告的屬性為密封屬性。類的密封屬性不允許在派生類中被繼承。密封屬性的訪問器同樣也是密封的。

2. 屬性宣告時如果有sealed 修飾符,同時也必須要有override 修飾符。

從上面可以看出,屬性的這些規則與方法十分類似。對於屬性的訪問器,我們可以把get 訪問器看成是乙個與屬性修飾符相同、沒有引數、返回值為屬性的值型別的方法,把set 訪問器看成是乙個與屬性修飾符相同、僅含有乙個value 引數、返回型別為void 的方法。看下面的程式:

using system ;

public enum ***

;abstract public class people

}private *** m_*** ;

public virtual *** ***

protected string s_card;

public abstract string card}

上面的例子中宣告了"人"這個類,人的姓名name 和性別*** 是兩個唯讀的虛屬性:身份證號card 是乙個抽象屬性,允許讀寫,因為類people 中包含了抽象屬性card,所以people 必須宣告是抽象的。下面我們為住宿的客人編寫乙個類類從people 中繼承。再看下面的程式:

class customer: people

set

}public int day

set

}public override string name

}public override *** ***

}public override string card

set } }

在類customer 中,屬性name、 *** 和card 的宣告都加上了override 修飾符,屬性的宣告都與基類people 中保持一致。name 和*** 的get 訪問器,card 的get 和set訪問器都使用了base 關鍵字來訪問基類people 中的訪問器屬性。card 的宣告過載了基類people 中的抽象訪問器。這樣,在customer 類中沒有抽象成員的存在,customer可以是非虛的。 

深入剖析C 繼承機制6

五 繼承與訪問修飾符 訪問修飾符是一些關鍵字,用於指定宣告的成員或型別的可訪問性。類的繼承中有四個訪問修飾符 public protected internal private。使用這些訪問修飾符可指定下列五個可訪問性級別 public protected internal internal pro...

深入剖析C 繼承機制2

二 c 中的繼承符合下列規則 1 繼承是可傳遞的。如果c從b中派生,b又從a中派生,那麼c不僅繼承了b中宣告的成員,同樣也繼承了a中的成員。object 類作為所有類的基類。2 派生類應當是對基類的擴充套件。派生類可以新增新的成員,但不能除去已經繼承的成員的定義。3 建構函式和析構函式不能被繼承。除...

深入剖析C 繼承機制4

2 隱藏基類成員 想想看,如果所有的類都可以被繼承,繼承的濫用會帶來什麼後果?類的層次結構體系將變得十分龐,大類之間的關係雜亂無章,對類的理解和使用都會變得十分困難。有時候,我們並不希望自己編寫的類被繼承。另一些時候,有的類已經沒有再被繼承的必要。c 提出了乙個密封類 sealed class 的概...