2009-08-28 54 views
2

如果我接口有簽名唯一吸氣劑,如:制定者的屬性在接口沒有定義

public interface IInterface 
{ 
    object Id{get;} 
} 

所以接口只規定Id的任何實施 類公有的getter現在,當我有類:

public class Simple : IInterface 
{ 
    object Id 
    { 
    get{return something;} 
    set{ do something else;} 
    } 
} 

編譯器抱怨setter,因爲setter沒有在接口中定義。然而,我並沒有在接口協議中爲setter指定任何東西;爲什麼界面堅持派生類的setter?

+0

什麼是實際的編譯器錯誤? – 2009-08-28 20:33:23

+0

你從他的類中得到的編譯器錯誤是因爲它不是公共的,所以Id不能實現這個接口。 – 2009-08-28 20:34:54

回答

11

你只需要讓Id公開。例如,該編譯罰款:

public interface IInterface 
{ 
    object Id { get; } 
} 
public class Simple : IInterface 
{ 
    private int something; 
    public object Id 
    { 
     get { return something; } 
     set{ something = (int)value;} 
    } 
} 
+0

當我將Id聲明爲顯式聲明時,我無法使用public,你知道爲什麼嗎? – VolkanUzun 2009-08-28 20:40:04

+0

是的。顯式聲明是不同的 - 它們本質上是公共的,但只用作接口本身(接口總是公共的)。然而,明確的實現將不允許setter,因爲接口(這是你將使用的)將只有屬性上的getter。 – 2009-08-28 20:47:02

+0

但是接下來爲什麼界面關心setter?我看到接口解釋代碼的方式是:只有一個getter,所以它應該是隻讀的;但你也不能解釋爲:我只關心應該有一個吸氣劑;這是合同;我不關心setter – VolkanUzun 2009-08-28 20:58:21

1

在設計.NET,微軟決定將有三個不可互換的類型的屬性:只讀,只寫和讀寫。在C#中,如果聲明與應用實現的一個或多個接口屬性具有相同名稱的讀寫屬性,編譯器不僅可以自動創建程序員實際指定的讀寫屬性,還可以自動創建只讀和/或只寫屬性以滿足接口。例如,如果接口IReadableFoo實現只讀屬性Foo,則IWritableFoo實現只寫屬性Foo,並且IReadWriteFoo繼承IReadableFoo和IWritablefoo,並實現「新」讀寫屬性Foo,並且類ReadWriteFoo實現IReadWriteFoo並聲明公共讀寫屬性Foo,編譯器將具有ReadWriteFoo生成只讀屬性IReadableFoo.Foo,只寫屬性IWritableFoo.Foo和讀寫屬性IReadWriteFoo.Foo的接口實現。