2011-08-12 31 views
1

聲明我知道接口的概念和實施起來還爲什麼不能變量或字段接口+ C#

我知道屬性和方法的定義可以寫入接口。

但是,當經歷相關話題時,我才知道我們不能在界面中聲明一個變量。只是想知道它的原因?

+0

看看[this](http://stackoverflow.com/questions/2115114/why-cant-c-interfaces-contain-fields)上一篇文章。 – Vladimir

回答

1

可以說它可以被定義。所以:

interface Foo 
{ 
    int Number; 
    string Text; 
} 

class Bar : Foo 
{ 
    public int Number; 
    public string Text; 
} 

所以,(實現美孚接口類)每個派生類,你就必須建立兩個公共成員。至少對我而言,這是毫無意義的。

如果你想你的類有一些成員是不是方法,你想簡化它儘可能,看看Auto-Implemented Properties

4

因爲變量和字段是實現。接口是聲明它們做什麼的合同,而不是它們如何做。

如果你想聲明字段,那麼你需要創建一個基類(可能是抽象類)。

從消費者的角度來看,接口和抽象基類之間的一個重要區別是,只能從一個基類派生類,而類可以實現儘可能多的接口。

0

超越「因爲這是規範」我不確定,其中一個原因可能是,在我看來,在接口中允許允許可以直接綁定到一個方法(屬性映射一個或兩個方法) 。

1

接口旨在描述行爲,而不是實現。

0

接口的用法是什麼?它基本上就是合同。那麼,在合同中聲明一個變量的預定義格式有什麼意義?沒用。加上它就像一個模板。

0

一個接口的想法是聲明一個類型的部分對外界來說是合理的,或者反過來不關心實現的細節。因爲字段應該被視爲實現細節,所以即使能夠聲明它們也是矛盾的

1

因爲變量定義了事物在對象中的存儲方式。這與接口的想法不兼容。

而且這會導致多重繼承式的問題,如

interface A { int x; } 
interface B { int x; } 
class C : A, B 

x實例應包括在C(一個OCH都和你如何區別它們在這種情況下?)

您應該在界面中使用屬性,因爲您可以通過指定實現來定義該屬性。這符合相同的目的,但具有更好的封裝。

+0

假設我們可以有一個接口聲明一個字段,並且它只是意味着任何實現該接口的類都必須提供一個具有相同名稱的同一類型的公共字段,但我不明白「哪個實例x應該包含在C中嗎?「是相關的。兩個接口上的字段'x'只會引用內存中的相同內容。想想一個類'C'實現兩個接口'A'和'B',它們都聲明瞭一個'void x();'。你在這裏看到什麼問題嗎? –

+0

我認爲@Albin提到的*多重繼承風格問題是指*鑽石問題*,也就是說,當您有一個類「D」繼承於類「B」和「C」時,共同父類「A」中的一些方法。如果你在'D'的實例中調用該方法,哪個代碼會被執行? –

0

接口充當contract。所以,它不能包含variable declaration。但是,它可能包含Properties解碼,您將在inherited class中執行。

相關問題