繼承和介面
一、 抽象類
抽象類和介面的關係非常緊密,都必須有要實現的成員。它們最大的區別是由抽象類可以派生出一些成員的實現,但介面卻不包含任何成員的實現。當派生出的事物都屬於同乙個種類時,此時可用抽象類;當派生出的事物的功能要求完全不同的類物件時,就要用介面實現。
抽象類要求至少有乙個抽象成員,抽象成員就是在派生類中必須被的成員。
抽象類使用關鍵字abstract宣告。
虛方法也要使用關鍵字abstract宣告。
重寫方法和屬性
在方法或屬性上加上關鍵字override
呼叫基類方法
base.method
替代方法和屬性
有時需要阻止多型行為,或在基類中為某個類成員使用乙個名稱,而在派生類中卻要以一種新的方式使用該名稱,這稱為「遮蔽」。可通過new修飾符實現。
二、 物件導向程式設計的幾條基本規則
1、 保持少量的公共介面,大約6個左右的公共成員最適宜。
2、 許多類使用的是簡單的介面,而不使用一些龐大複雜、能完成所有功能的方法。
3、 盡可能地使用私有方法來支援公共行為;強烈推薦多使用單值方法,少使用複雜龐大的方法(無論別人怎麼說,最後這句是關鍵)。
5、 如果考慮到類的使用者可能需要擴充套件類的行為,可使用protected和abstract修飾符。
有一些書籍建議讀者在不知道如何重用泛化類時,一律把方法定義為受保護的虛方法,但這樣會使得程式過於龐大,並且程式執行速度也會變慢)。
方法是用來建立新行為的。擁有越多的方法,就有更多的方式來組合這些方法。類是描述系統的實體。擁有的類越多,在描述系統時就具有更大的靈活性。如果系統出現錯誤,那麼錯誤將較多地出現在那些受保護型別和私有型別的方法和類中,而較少地出現在公共方法中。複雜龐大的方法和子過程通常是乙個系統不健全、擴充套件性不好的標誌。
三、 繼承與聚集
當從現有的基類派生乙個新類時(也就是繼承的時候),將得到這個基類所有成員的乙個副本。這被稱為「is-a」關係。
當乙個類包含另外乙個物件時,稱為「包含」(containment)或者「聚集」(aggregation)。當根據被包含類的實現來定義容器類成員時,能使得容器類在其外觀和行為上類似於被包含的類。聚集關係可稱為乙個「has-a」關係。
聚集能夠完成一些和派生類相同的操作,但是不能通過「is-a」測試。
如果要想使派生類和父類具有相同的型別成員,則應選用繼承;如果需要定義乙個「整體-部分」的關係,也就是,被包含的物件是包含它的物件的一部分,則應選用聚集;如果需要改進被包含物件的介面,例如,當乙個類有很多不符合需求的特徵和公共成員時,則需要將現有的類包裝在乙個新類中,並僅使得符合新需求的那些成員可見。
四、 定義介面
介面定義了一種「契約」(contract)。確切地說,乙個介面就是乙個型別,它包括方法、屬性、和事件的頭部,但不包含實現**。介面能夠被繼承及實現,其中繼承是擴充套件這種契約的一種方法。
介面自身不能被建立,內容也不能被充實和給出實現**。當.net類接受一種介面契約時,類就必須實現介面定義的所有成員,這也是契約責任的關鍵。
1、 介面的基本準則
1) 介面定義方法、屬性和事件簽名,但不包含實現。
2) 介面可以執行任意型別的訪問,即介面能夠使用任何訪問修飾符。介面的成員永遠是公共的,不能用任何訪問修飾符。
3) 介面可以巢狀。
4) 介面可以實現為共享的、抽象的或者虛成員。
5) 不能對介面成員附加安全屬性。
6) 介面被看作恆定不變的,一旦您出於使用目的而發布了介面,就不應該改變這個介面。通常應該建立乙個新的介面來擴充套件現有介面。
7) 與類一樣,在介面中最好只定義幾個關係緊密的成員,成員過多將使得介面變得笨重而難以使用。這樣的介面稱為「factoring」介面。
8) 用字首「i」來區分介面和類,並且用pascal命名方式(pascal-casing)方式來命名介面(在pascal命名方式中,每個單詞的首字母大寫,例:iminte***ce)
9) 不能建立介面的例項。
五、 比較抽象類和介面
1、 抽象類可被部分實現,而介面需要完全實現。
2、 類支援單繼承,介面支援多繼承。
3、 如果繼承乙個抽象類,當你類更新時,所有的子類都會跟著更新;而介面是一成不變的,一旦發布了乙個介面,永遠不要再更改它。
4、 如果行為跨越不同類的物件,可使用介面。對於一些相似類的物件,用繼承。
5、 使用介面來支援少量的附加功能,對於很多關聯功能,可使用抽象類。
繼承和介面
一 抽象類 抽象類和介面的關係非常緊密,都必須有要實現的成員。它們最大的區別是由抽象類可以派生出一些成員的實現,但介面卻不包含任何成員的實現。當派生出的事物都屬於同乙個種類時,此時可用抽象類 當派生出的事物的功能要求完全不同的類物件時,就要用介面實現。抽象類要求至少有乙個抽象成員,抽象成員就是在派生...
繼承 繼承介面和實現
在繼承體系中有的時候希望只繼承乙個介面,例如在圖形體系中繼承draw 函式,因為每個圖形都有不同的畫法,所以只能繼承乙個介面,具體怎麼畫要到派生類中具體實現。所以要定義如下 class shape class rectangle public shape class angle public sha...
關於繼承和介面
繼承是一種行為,說明子類擁有父類的方法,並且可以覆蓋父類的同名同引數方法。而介面是一種操作定義,它定義實現它的類所必須要有的方法。有了介面之後,設計程式時,才能夠面向介面程式設計,使得程式適應性大幅度提高。做個比方,你知道開會,一定是先致幕詞,然後討論,然後結束總結。每個會議都有這三個步驟,但是你不...