我讀了一些關於分界面:C# - 接口澄清
而 「 接口是合同類必須conform.It不 繼承什麼的定義 。」定義接口和抽象類之間的差異可以這樣說:
當一個類是從抽象類派生時,它被稱爲真正的繼承。當一個clas s使用接口那麼它不是繼承,它是一個契約的實現?
我讀了一些關於分界面:C# - 接口澄清
而 「 接口是合同類必須conform.It不 繼承什麼的定義 。」定義接口和抽象類之間的差異可以這樣說:
當一個類是從抽象類派生時,它被稱爲真正的繼承。當一個clas s使用接口那麼它不是繼承,它是一個契約的實現?
是的你是對的。界面只是一個合同,類。
注意:接口不是源自任何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)
{
}
}
當一個類使用接口,那麼它是不是 繼承,它是一個 實現合同
是的,這正是它是如何。
如果你看看當你有一個接口繼承另一個接口時會發生什麼,這可能會更清楚一些。這可能令人困惑,因爲我們只是說接口它不是繼承而是合約定義。如果你把下面的代碼:如果您檢查類B
和AB
的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
,但沒有涉及傳統意義上的繼承。
當一個類從抽象 類派生,它被稱爲inheritance.When一類使用 接口,那麼它是不是 繼承,這是 合同的執行情況真正 ?
一個抽象類和接口之間的區別在於,一個接口沒有定義的任何的這種方法的實現,和一個抽象類提供了一些實施方式。這是唯一的區別。抽象類和具體類之間的區別在於,抽象類至少有一個成員沒有提供實現。
接口可以從其他接口派生。
由於複雜的原因以及前一時代宗教戰爭的一部分,只允許接口進行多繼承。
是繼承..你是對的只是總結
什麼是抽象類?
抽象類是一種特殊的類,不能被實例化。所以問題是爲什麼我們需要一個無法實例化的類?一個抽象類只能被分類(繼承)。換句話說,它只允許其他類從它繼承,但不能被實例化。優點是它爲所有子類強制執行某些層次結構。簡而言之,它是一種強制所有子類繼承相同層次或標準的合約。
什麼是接口?
接口不是一個類。它是由Interface界定的實體。接口沒有實現;它只有簽名或者換句話說,就是沒有身體的方法的定義。作爲Abstract類的一個相似之處,它是一個用於爲所有子類定義層次結構的契約,或者它定義了特定的一組方法及其參數。它們之間的主要區別是一個類可以實現多個接口,但只能從一個抽象類繼承。由於C#不支持多重繼承,接口用於實現多重繼承。
兩者一起
當我們創建一個接口,我們基本上建立了一套方法,而必須由實現類覆蓋任何實現。其優點是它爲類提供了一種方法,使其成爲兩個類的一部分:一個來自繼承層次結構,另一個來自接口。
當我們創建一個抽象類時,我們正在創建一個基類,它可能有一個或多個已完成的方法,但至少有一個或多個方法未完成並聲明爲抽象。如果抽象類的所有方法都未完成,則它與接口相同。抽象類的目的是爲一組派生類的工作方式提供基類定義,然後允許程序員在派生類中填充實現。
接口正在定義一個接口。試想一下界面這個詞。
簡單。
它定義瞭如何與類交互(接口!)。
只需將您的大腦重新放回原位,您就會發現答案就在您的面前。
一個抽象類和接口之間的區別,如果你研究問題的使用兩個關鍵字是最好的理解:
本質上,接口是一個特殊的構造,它定義了一個代碼契約。創建它時,它不能包含任何實現;它只是指定合同要求的屬性和方法的簽名。當一個類實現接口時,它必須提供與合約中指定的完全相同的每個屬性和方法。實施階級負責提供實施。
一個抽象類,然而,它可以自由地提供儘可能多或儘可能少的實現,因爲它想要或需要。它本身可能會實現一個接口。抽象類所要求的全部內容是標記爲abstract
。通過在抽象(基本)類中標記方法virtual
,並在派生類中使用overrides
關鍵字,可以由派生類重寫其成員。但抽象基類沒有義務提供任何功能;也沒有義務提供最少數量的缺乏實施的虛擬方法。
希望這會有所幫助!
實際上,在技術上,抽象類不需要包含至少一個不包含實現的成員。抽象類可以用實現來定義它的所有方法,並簡單地將它們標記爲虛擬。區別在於一個接口永遠不會提供一個實現,因此指定了一個實現類必須遵守的合約。 – 2009-10-03 05:46:18
不夠公平,但如果基類包含抽象方法,它也定義了一個契約。如果一個抽象類沒有抽象方法,那麼這個稱謂就是多餘的。在我主張對這個主題有'實用主義者'觀點的時候,我會接受一個標記爲抽象的類可以被稱爲抽象的,即使它不是。在無法調用接口實現的語義適當的參考框架中,「繼承」,我認爲將不具有抽象方法的類稱爲抽象類也是不恰當的。 僅供參考我可以明確定義合同。 – 2009-10-03 22:55:14