抽象類和介面的區別

2021-07-06 11:31:52 字數 1872 閱讀 2599

星期五了,dmall最終還是沒有招我。我很傷心。

還是好好看書,讓他知道這是他的失誤吧。可能因為我不是計算機專業的原因,也可能是面試回答的問題不夠好。

面試中有乙個這樣的問題,說說抽象類和介面的區別。

其實我是知道的可是我沒有說好,今天看到別人寫的,我抄過來。

繼承

下面將從眾所周知的介面和抽象類的區別開始。這種差異是關於繼承的,任何類都可以實現實現多個介面,但是只能擴充套件乙個類,也只能有乙個類。

多個擴充套件是乙個語言特性,它存在於一些面對的語言。為什麼呢?因為他帶來的問題往往多於價值。

當乙個類有許多父類時,有乙個情況就是完全相同的方法會宣告多個,因此必須顯示地「告知」究竟需要的是哪乙個。

這樣的**通常難以維護,因為對其進行的任何修改或者重構都必須小心地檢查。另乙個方面,如果乙個類需要擴充套件至少兩個擁有相同方法的類,那麼dry規則顯然會被破壞,或者說會干擾到sap。

「如果多個類的繼承如此糟糕,為什麼他可以實現多介面呢?」——如果這樣的問題在你的腦海中盤旋,我不得不承認這是乙個絕妙的問題。

然而,答案很簡單。每個介面都是基於函式而不是乙個類去實現。所以,即使實現十個不同的介面,每個包含相同的方法宣告,內部也不會發生衝突。介面保證了方法的存在,而不是去說明方法的實現,這意味著,只要不違反srp,你完全可以實現多個介面。

【我的理解很簡單,就是從繼承這個角度來看,如果多繼承將會出現繼承的方法名相同內容不同的情況,導致錯誤,而介面不會出現,因為介面只有方法名沒有內容,內容是自己去實現的,則不會出現錯誤】

方法的可見度

介面中的所有方法都是public的,但對於抽象類的宣告並沒有這樣的規則,當然不能是private。為什麼不能private?因為乙個抽象方法需要在子類中實現,但private無法訪問子類,因此不抽象類不可能存在private屬性。

接著回歸問題。正如上文所寫道的,介面是乙個函式的保證,你可以把它當做使用介面類和實現這個介面之間的乙個合約——保證乙個特定類將實現所有宣告的方法。這也是為什麼這些方法必須是public的原因。因為被嚴格的限制到了實現上,所以其他一切都不成問題。

然而,當涉及到抽象類時並非這樣。我們總是可以有不同的類組,除了這幾方面基本上不同以外,其他地方幾乎一樣,類體的公共方法也是非常相似的。在這中情況下,可以建立protected方法來保持類之間的差異。

【我的理解就是,介面中的方法必須都是public修飾的,而抽象類中的方法除了public修飾還可以是protected修飾】

宣告和定義

介面只能包含方法宣告,而抽象類還可以包含方法的定義。

介面的重點在於提供特供特定函式,而抽象類還在於子類實現的相似性,不僅僅是其中的函式。

【我的理解,就是用途上的區別的官方說法】

常量

介面和抽象類中都可以定義常量。因為這些值不依賴特定物件,對他們來說都是相同的。

【常量是可以不用建立物件來實現的,直接用類名來呼叫】

屬性

抽象類可以包含屬性,但介面不能。原因與宣告和定義是一樣的。

【基本從五個方面去闡述了他們的不同,繼承,方法的可見度,宣告和定義,常量,屬性】

哎,再說一遍,我被淘汰了,和我一起的乙個我們學校的同學,是計算機專業的,我感覺他的水平和我差不多,為什麼要他不要我,我會比他強的!!!

傷心中。

這幾天也是因為聽宣講會呀,面試呀,筆試呀,搞得焦頭爛額,也沒怎麼更新部落格,和看書。

真的煩。

明天繼續看書,繼續更新部落格。

抽象類和介面的區別

要結合來使用,從而互補長短。接下來先說說抽象類和介面的區別。區別一,兩者表達的概念不一樣。抽象類是一類事物的高度聚合,那麼對於繼承抽象類的子類來說,對於抽象類來說,屬於 是 的關係 而介面是定義行為規範,因此對於實現介面的子類來說,相對於介面來說,是 行為需要按照介面來完成 這些聽起來有些虛,舉個例...

抽象類和介面的區別

net提供了介面,這個不同於class或者struct的型別定義。介面有些情況,看似和抽象類一樣,因此有些人認為在.net可以完全用介面來替換抽象類。其實不然,介面和抽象類各有長處和缺陷,因此往往在應用當中,兩者要結合來使用,從而互補長短。接下來先說說抽象類和介面的區別。區別一,兩者表達的概念不一樣...

抽象類和介面的區別

net提供了介面,這個不同於class或者struct的型別定義。介面有些情況,看似和抽象類一樣,因此有些人認為在.net可以完全用介面來替換抽象類。其實不然,介面和抽象類各有長處和缺陷,因此往往在應用當中,兩者要結合來使用,從而互補長短。接下來先說說抽象類和介面的區別。區別一,兩者表達的概念不一樣...