2017-05-31 90 views
-1

我的老師一直在說接口不存在,所以可以使用它們作爲在c#中實現多重繼承的一種方式。爲什麼多重繼承不是接口的主要目的?

這是爲什麼?那他們到底是什麼?沒有人可以很容易地向我解釋這一點,但我很困惑。

,我讀了描述接口幾篇文章和書籍,似乎所有的人都建議使用接口作爲一種變通方法來實現多重繼承..

+1

繼承通常會讓你更富有。界面只會讓你變得更窮,它們會讓你更加努力地去實現它們。 –

+2

鑑於接口不包含任何實現,它們肯定不能用於給你*繼承* - 沒有什麼可以繼承。只有您需要在聲稱實現給定接口的類中實際實現的合約。這就是爲什麼我們首先使用這兩個詞 - 「繼承」與「實現」。 – Luaan

+2

接口允許您在對象上執行合同。該對象將至少具有**接口「功能」,允許您對其執行某種操作。該對象不一定必須滿足「是」的條件,這通常是繼承所要求的。一個對象可以實現儘可能多的接口。 –

回答

1

在靜態類型語言,或者在使用靜態類型在使用動態和靜態類型(如C#)的語言中,繼承由兩部分組成。界面和實現。界面是一個合同,表示它將滿足一組特定的方法或屬性。實現是實際執行的代碼。代碼實現了的一個接口。

接口用於保證對象實現特定的合同。這可以是單個合同,也可以是多個合同。這不是多繼承,它繼承了接口和實現。

是的,有些人試圖用多個接口來模擬多重繼承,但這不是它的目的,而且仿真非常差。

多個接口說對象支持多個合同。多重繼承說一個對象重用多個實現。同樣,繼承需要接口和實現。接口實現只是接口。

+0

我的老師剛纔說了第一段。現在看來對我來說更合乎邏輯了。謝謝@Erik! – RoloffM

1

接口形成一個契約(他們說對象可以做什麼),但不提供實現。

爲什麼要麻煩?定義合同是額外的工作,爲什麼不創建一個班級?

例如,假設您想開發一個繪圖應用程序。你可能會想出幾個對象,如圓形,三角形,方形等,然後你開始添加方法並添加諸如Draw()之類的東西。這是你可以添加到所有形狀實現的接口。在C#中,按照慣例,它將被命名爲IDrawable

但爲什麼不上課?

讓我們假設您正在擴展應用程序並添加對形狀分組的支持,以創建更復雜的模式。這些組也可以繪製,所以它們也有Draw()方法。現在,如果你只想畫出「東西」,你不需要知道它是一個形狀還是一個組,或者你還沒有發明的其他東西。

但爲什麼不上課?

由於可能有更多的功能,如Move()Serialize()等,並且C#不允許您從多個類繼承。

爲什麼不呢?

這不是一個技術限制,而是C#語言設計者做出的選擇。一些語言,如C++允許它,但它帶來很少的技術問題,最着名的是diamond problem。它也使得編譯器更加複雜,並且已經決定it is not worth it。它也