第二回 對抽象程式設計 介面和抽象類

2021-04-14 21:04:05 字數 3826 閱讀 2047

轉貼請註明出處,留此資訊。

• 物件導向思想:多型

• 介面

• 抽象類

1. 引言

在我之前的一篇post《抽象類和介面的誰是誰非

》中,和同事管偉的討論,得到很多朋友的關注,因為是不成體系的論道,所以給大家了解造成不便,同時關於這個主題的系統性理論,我認為也有必要做以總結,因此才有了本篇的新鮮出爐。同時,我將把上貼中的問題順便也在此做以交代。

2. 概念引入

介面是包含一組虛方法的抽象型別,其中每一種方法都有其名稱、引數和返回值。介面方法不能包含任何實現,clr允許介面可以包含事件、屬性、索引器、靜態方法、靜態字段、靜態建構函式以及常數。但是注意:c#中不能包含任何靜態成員。乙個類可以實現多個介面,當乙個類繼承某個介面時,它不僅要實現該介面定義的所有方法,還要實現該介面從其他介面中繼承的所有方法。

定義方法為:

public

inte***ce

system.icomparable

public

class

testcls: icomparable

private

int_value;

public

intvalue

set} 

public

intcompareto(

objecto)}

} 抽象類提供多個派生類共享基類的公共定義,它既可以提供抽象方法,也可以提供非抽象方法。抽象類不能例項化,必須通過繼承由派生類實現其抽象方法,因此對抽象類不能使用new關鍵字,也不能被密封。如果派生類沒有實現所有的抽象方法,則該派生類也必須宣告為抽象類。另外,實現抽象方法由overriding方法來實現。

定義方法為:

//////

定義抽象類

///

abstract

public

class

animal //

定義方法

public

abstract

void

eat(); 

//定義索引器

public

string

this

[inti] 

} ///

///實現抽象類

///

public

class

dog: animal

set} 

public

override

void

eat()} 

3. 相同點和不同點3.1 相同點

3.2 不同點

通過相同與不同的比較,我們只能說介面和抽象類,各有所長,但無優略。在實際的程式設計實踐中,我們要視具體情況來酌情量才,但是以下的經驗和積累,或許能給大家一些啟示,除了我的一些積累之外,很多都**於經典,我相信經得起考驗。所以在規則與場合中,我們學習這些經典,最重要的是學以致用,當然我將以一家之言博大家之笑,看官請繼續。

3.3 規則與場合

請記住,物件導向思想的乙個最重要的原則就是:面向介面程式設計。

借助介面和抽象類,23個設計模式中的很多思想被巧妙的實現了,我認為其精髓簡單說來就是:面向抽象程式設計。

抽象類應主要用於關係密切的物件,而介面最適合為不相關的類提供通用功能。

介面著重於can-do關係型別,而抽象類則偏重於is-a式的關係;

介面多定義物件的行為;抽象類多定義物件的屬性; 

介面定義可以使用public、protected、internal 和private修飾符,但是幾乎所有的介面都定義為public,原因就不必多說了。

「介面不變」,是應該考慮的重要因素。所以,在由介面增加擴充套件時,應該增加新的介面,而不能更改現有介面。

盡量將介面設計成功能單一的功能塊,以.net framework為例,idisposable、idisposable、icomparable、iequatable、ienumerable等都只包含乙個公共方法。

介面名稱前面的大寫字母「i」是乙個約定,正如欄位名以下劃線開頭一樣,請堅持這些原則。

在介面中,所有的方法都預設為public。 

如果預計會出現版本問題,可以建立「抽象類」。例如,建立了狗(dog)、雞(chicken)和鴨(duck),那麼應該考慮抽象出動物(animal)來應對以後可能出現風馬牛的事情。而向介面中新增新成員則會強制要求修改所有派生類,並重新編譯,所以版本式的問題最好以抽象類來實現。

從抽象類派生的非抽象類必須包括繼承的所有抽象方法和抽象訪問器的實實現。

對抽象類不能使用new關鍵字,也不能被密封,原因是抽象類不能被例項化。

在抽象方法宣告中不能使用 static 或 virtual 修飾符。

以上的規則,我就厚顏無恥的暫定為t14條吧,寫的這麼累,就當一時的獎賞吧。大家也可以互通有無,我將及時修訂。

4. 經典示例

4.1 絕對經典

.net framework是學習的最好資源,有意識的研究fcl是每個.net程式設計師的必修課,關於介面和抽象類在fcl中的使用,我有以下的建議:

4.2 別樣小菜

下面的例項,因為是我的理解,因此給經典打上「相對」的記號,至於什麼時候晉公升為「絕對」,就看我在.net追求的路上,是否能夠一如既往的如此執著,因此我將把相對重構到絕對為止(呵呵)。 本示例沒有闡述抽象類和介面在設計模式中的應用,因為那將是另一篇有討論價值的文字,本文著眼與概念和原則的把握,但是真正的應用來自於具體的需求規範。

設計結構如圖所示:

1. 定義抽象類

public

abstract

class

animal

//宣告抽象方法

public

abstract

void

show();

//實現一般方法

public

void

makevoice()}

2. 定義介面

public

inte***ce

iaction

...

3. 實現抽象類和介面

public

class

duck : animal, iaction

//過載抽象方法

public

override

void

show()

//過載抽象屬性

public

override

string

name}//

實現介面方法

public

void

move()

}public

class

dog : animal, iaction

public

override

void

show()

public

override

string

name

}public

void

move()}

4. 客戶端實現

public

class

testanmial}

5. 他山之石正所謂真理是大家看出來的,所以將園子裡有創新性的觀點潛列於此,一是感謝大家的共享,二是完善一家之言的不足,希望能夠將領域形成知識,受用於我,受用於眾。

最後,msdn的建議是:

6. 結論

對抽象程式設計 介面和抽象類

轉貼請註明出處,留此資訊。物件導向思想 多型 介面 抽象類 1.引言 在我之前的一篇post 抽象類和介面的誰是誰非 中,和同事管偉的討論,得到很多朋友的關注,因為是不成體系的論道,所以給大家了解造成不便,同時關於這個主題的系統性理論,我認為也有必要做以總結,因此才有了本篇的新鮮出爐。同時,我將把上...

抽象方法 抽象類 介面 介面和抽象類的區別

某個父類只知道子類因該包含什麼樣的方法,無法知道這些子類如何實現這些方法。抽象類包含該方法但沒有對該方法的具體實現。有抽象方法的類只能被定義為抽象類,抽象類裡可以沒有抽象方法。抽象方法和抽象類的規則 public abstract class shape private string color p...

介面,抽象類和抽象方法

1.定義介面 介面使用 inte ce 關鍵字宣告,它與類的宣告類似。介面宣告預設 是 public 的。通常介面命名已i字母開頭。inte ce 介面名 2.介面繼承介面 多個介面用,號進行區分 inte ce 介面名 繼承的介面名 3.類實現介面 訪問修飾符 class 類名 介面名 4.乙個類...