2009-10-27 61 views
2

是什麼區別:我應該使用繼承還是接口?

type IFooable = 
    interface IDisposable 

    abstract Foo : (unit -> unit) 

type IFooable = 
    inherit IDisposable 

    abstract Foo : (unit -> unit) 

如果相當,在哪些情況下我應該使用另一種嗎? 謝謝!

回答

6

(我原本以爲)您必須使用(最多一個)「基地」「繼承」。你可以使用'接口'來實現你要實現的任何接口。

所以在IDisposable的情況下,它必須是'接口'。

編輯,確定編譯器允許的話,但可能是一個錯誤,我會看

編輯:原來,這是一個可能的錯誤的其他方式,並有可能接口將迫使你用「繼承」繼承其他接口,這個想法是'繼承'成員總是直接在'隱式接口'意義上可見,而類的'接口'聲明是一個'顯式'接口,需要轉換爲該接口類型才能使用那些成員。無論如何,我們可能會在語言語法中刪除這種靈活性,這樣只有一種方法可以創作,而不是兩種等效的方法。

+0

太好了,謝謝Brian。 – Stringer 2009-10-27 01:04:15

+0

有道理。我現在對此有了更好的理解。非常感謝! – Stringer 2009-10-30 23:07:31

-1

如果你只打算使用抽象方法,你應該使用接口。因爲你只能繼承一個類,但你可以實現很多接口。

+1

如果你拼出你的話,您可能不會收到downvotes。 – recursive 2009-10-27 00:58:29

0

我傾向於使用繼承來實現真正的oop(即X isa Y)和接口作爲一種裝飾器實現。

可能不是事實上「正確」的方式來做到這一點,但我們非常喜歡它。

我的意思是X將繼承Y,但我們會想給它從V,W和Z.

「捷達轎車ISA一些額外的功能,但也IDiesel,IGerman,IBroken 「

這只是我目前的項目做它的方式,我可能會得到downvoted的‘空中接力的濫用’,或東西:)

+0

聽起來很瘋狂。如果你的車同時使用IBroken和IWorkingOrder會怎麼樣? IToyota和IFord? – Stringer 2009-10-27 01:21:23

+0

好吧,這是一個可怕的例子! :) 在現實中,一個更好的例子是一個TabControl,它有一堆專門的TabPages。有些是ITxRx,因爲它們具有某些類型的行爲。別人是另一種。 瘋狂的設計,當然,但奇怪的是,它工作得很好。 – 2009-10-27 01:25:24