2009-10-03 53 views
3

我讀了一些關於分界面:C# - 接口澄清

而 「 接口是合同類必須conform.It不 繼承什麼的定義 。」定義接口和抽象類之間的差異可以這樣說:

當一個類是從抽象類派生時,它被稱爲真正的繼承。當一個clas s使用接口那麼它不是繼承,它是一個契約的實現?

回答

3

是的你是對的。界面只是一個合同,類。

注意:接口不是源自任何System.Object衍生類型。一個接口只是一個抽象類型,它由一組虛擬方法組成,每個方法都有自己的名稱,參數,返回類型和 。接口方法不能包含任何實現;因此,接口類型 不完整(抽象)。

例如:

interface I1 
{ 
} 
interface I2 
{ 
} 

abstract class a1 
{ 
} 
abstract class a2 
{ 

} 
class App:a1,I1,I2 //no Error 
{ 
static void Main(string[] args) 
{  
} 
} 

注:CLR允許類型僅由一種其它類型的,其具有System.Object的作爲其根的基類型

 interface I1 
     { 
     } 
     interface I2 
     { 
     } 

     abstract class a1 
     { 
     } 
     abstract class a2 
     { 

     } 
     class App:a1,a2,I1,I2 // Error 
     { 
     static void Main(string[] args) 
     {  
     } 
     } 
1

當一個類使用接口,那麼它是不是 繼承,它是一個 實現合同

是的,這正是它是如何。

如果你看看當你有一個接口繼承另一個接口時會發生什麼,這可能會更清楚一些。這可能令人困惑,因爲我們只是說接口它不是繼承而是合約定義。如果你把下面的代碼:如果您檢查類BAB的IL代碼

interface IA 
{ 
    void MethodA(); 
} 

interface IB : IA 
{ 
    void MethodB(); 
} 

class B : IB 
{ 
    public void MethodA() { } 
    public void MethodB() { } 

} 

class AB : IA, IB 
{ 
    public void MethodA() { } 
    public void MethodB() { } 
} 

(使用反彙編或類似的),你會發現,這兩個類是相同的,當涉及到哪些接口它們實現。界面IB作爲一個「快捷方式」,也包括界面IA,但沒有涉及傳統意義上的繼承。

1

當一個類從抽象 類派生,它被稱爲inheritance.When一類使用 接口,那麼它是不是 繼承,這是 合同的執行情況真正 ?

1

一個抽象類和接口之間的區別在於,一個接口沒有定義的任何的這種方法的實現,和一個抽象類提供了一些實施方式。這是唯一的區別。抽象類和具體類之間的區別在於,抽象類至少有一個成員沒有提供實現。

接口可以從其他接口派生。

由於複雜的原因以及前一時代宗教戰爭的一部分,只允許接口進行多繼承。

+1

實際上,在技術上,抽象類不需要包含至少一個不包含實現的成員。抽象類可以用實現來定義它的所有方法,並簡單地將它們標記爲虛擬。區別在於一個接口永遠不會提供一個實現,因此指定了一個實現類必須遵守的合約。 – 2009-10-03 05:46:18

+0

不夠公平,但如果基類包含抽象方法,它也定義了一個契約。如果一個抽象類沒有抽象方法,那麼這個稱謂就是多餘的。在我主張對這個主題有'實用主義者'觀點的時候,我會接受一個標記爲抽象的類可以被稱爲抽象的,即使它不是。在無法調用接口實現的語義適當的參考框架中,「繼承」,我認爲將不具有抽象方法的類稱爲抽象類也是不恰當的。 僅供參考我可以明確定義合同。 – 2009-10-03 22:55:14

2

是繼承..你是對的只是總結

什麼是抽象類?

抽象類是一種特殊的類,不能被實例化。所以問題是爲什麼我們需要一個無法實例化的類?一個抽象類只能被分類(繼承)。換句話說,它只允許其他類從它繼承,但不能被實例化。優點是它爲所有子類強制執行某些層次結構。簡而言之,它是一種強制所有子類繼承相同層次或標準的合約。

什麼是接口?

接口不是一個類。它是由Interface界定的實體。接口沒有實現;它只有簽名或者換句話說,就是沒有身體的方法的定義。作爲Abstract類的一個相似之處,它是一個用於爲所有子類定義層次結構的契約,或者它定義了特定的一組方法及其參數。它們之間的主要區別是一個類可以實現多個接口,但只能從一個抽象類繼承。由於C#不支持多重繼承,接口用於實現多重繼承。

兩者一起

當我們創建一個接口,我們基本上建立了一套方法,而必須由實現類覆蓋任何實現。其優點是它爲類提供了一種方法,使其成爲兩個類的一部分:一個來自繼承層次結構,另一個來自接口。

當我們創建一個抽象類時,我們正在創建一個基類,它可能有一個或多個已完成的方法,但至少有一個或多個方法未完成並聲明爲抽象。如果抽象類的所有方法都未完成,則它與接口相同。抽象類的目的是爲一組派生類的工作方式提供基類定義,然後允許程序員在派生類中填充實現。

0

接口正在定義一個接口。試想一下界面這個詞。

簡單。

它定義瞭如何與類交互(接口!)。

只需將您的大腦重新放回原位,您就會發現答案就在您的面前。

1

一個抽象類和接口之間的區別,如果你研究問題的使用兩個關鍵字是最好的理解:

本質上,接口是一個特殊的構造,它定義了一個代碼契約。創建它時,它不能包含任何實現;它只是指定合同要求的屬性和方法的簽名。當一個類實現接口時,它必須提供與合約中指定的完全相同的每個屬性和方法。實施階級負責提供實施。

一個抽象類,然而,它可以自由地提供儘可能多或儘可能少的實現,因爲它想要或需要。它本身可能會實現一個接口。抽象類所要求的全部內容是標記爲abstract。通過在抽象(基本)類中標記方法virtual,並在派生類中使用overrides關鍵字,可以由派生類重寫其成員。但抽象基類沒有義務提供任何功能;也沒有義務提供最少數量的缺乏實施的虛擬方法。

希望這會有所幫助!