3

我不確定發生了什麼事。我有以下的基類:C#屬性在派生類中不可用

public class MyRow : IStringIndexable, System.Collections.IEnumerable, 
    ICollection<KeyValuePair<string, string>>, 
    IEnumerable<KeyValuePair<string, string>>, 
    IDictionary<string, string> 
{ 
    ICollection<string> IDictionary<string, string>.Keys { } 
} 

後來才知​​道有這個派生類:

public class MySubRow : MyRow, IXmlSerializable, ICloneable, 
    IComparable, IEquatable<MySubRow> 
{ 
    public bool Equals(MySubRow other) 
    { 
     // "MyRow does not contain a definition for 'Keys'" 
     foreach (string key in base.Keys) { } 
    } 
} 

我爲什麼會得到這個錯誤? 「'MyNamespace.MyRow'不包含'Keys'的定義。這兩個類都位於MyNamespace名稱空間中。我嘗試訪問this.Keysbase.Keys,並且都不在MySubRow內工作。我試圖將Keys屬性標記爲public,MyRow,但得到了「修飾符」public「對此項無效」,我想因爲有必要實現一個接口。

回答

7

您正在明確實施Keys屬性。如果您想讓該成員可公開訪問(或protected),請將IDictionary<string, string>.Keys更改爲Keys,並在其前面添加相應的可見性修改器。

public ICollection<string> Keys { ... } 

protected ICollection<string> Keys { ... } 

你可以參考baseIDictionary<string, string>還有一個實例:

((IDictionary<string, string>)base).Keys 

更多信息

(由您的評論來看,你似乎是家庭騙子有所區別,但其他人可能不會)

C#接口的實現可以通過兩種方式完成:隱式或顯式。讓我們考慮一下這個接口:

public interface IMyInterface 
{ 
    void Foo(); 
} 

接口只是一個類的必須提供給代碼調用它的成員的約定。在這種情況下,我們有一個名爲Foo的函數,它不接受任何參數並且不返回任何內容。隱式接口的實現意味着你必須公開相匹配的接口上的成員的名稱和簽名public成員,像這樣:

public class MyClass : IMyInterface 
{ 
    public void Foo() { } 
} 

這滿足了接口,因爲它暴露了一個public部件相匹配的類界面上的每個成員。這是通常所做的。然而,有可能明確實現接口和接口功能映射到private成員:

public class MyClass : IMyInterface 
{ 
    void IMyInterface.Foo() { } 
} 

這對MyClass創建一個私有函數,只對外部用戶訪問時,他們指的是一個實例的IMyInterface。例如:

void Bar() 
{ 
    MyClass class1 = new MyClass(); 
    IMyInterface class2 = new MyClass(); 

    class1.Foo(); // works only in the first implementation style 
    class2.Foo(); // works for both 
} 

明確的實現是總是私人。如果你想在類之外公開它,你必須創建另一個成員並公開它,然後使用顯式的實現來調用另一個成員。通常這樣做是爲了讓類可以實現接口而不會混淆其公共API,或者如果兩個接口公開具有相同名稱的成員。

+0

的OP正在訪問的成員,而不是試圖實現它 – JaredPar 2010-01-27 16:04:33

+0

@Jared:看他的第一堂課。該財產在那裏實施,並且這是明確的。 – 2010-01-27 16:06:09

+0

@亞當,gotcha,錯過了明確的執行 – JaredPar 2010-01-27 16:07:07

3

既然你實施的IDictionary < TKEY的,TValue >接口明確,首先要投thisIDictionary<string,string>

public bool Equals(MySubRow other) 
{ 
    foreach (string key in ((IDictionary<string,string>)this).Keys) { } 
} 
+0

謝謝。我最終刪除了'MyRow'中的顯式接口聲明。現在它只是'公共ICollection Keys'和調用'base.Keys'的作品。 – 2010-01-27 16:07:05

+0

@Sarah,在某些情況下,您將不得不使用@dtb建議的內容,因爲多個接口將定義相同的方法名稱... – 2010-01-27 16:10:28

+0

@Rob:這實際上是我過去做過的,然後,由於重構,減少了類實現的接口,因此不再需要顯式實現。 – 2010-01-27 16:13:05

0

相信無論Jared和亞當是正確的:該屬性explitcity實現上基類,導致它不公開。你應該能夠將其更改爲一個隱含的實現,使其快樂:

public class MyRow : IStringIndexable, System.Collections.IEnumerable, 
    ICollection<KeyValuePair<string, string>>, 
    IEnumerable<KeyValuePair<string, string>>, 
    IDictionary<string, string> 
{ 
    ICollection<string> Keys { } 
} 
+0

我明確暗示和「公開」,是的。 – 2010-01-27 16:10:14

0

protected將允許繼承類的看到它,但沒有其他類

+0

雖然這不是問題。我無法將其標記爲「public」或「protected」,因爲我明確地實現了接口。在明確實現它的同時,添加一個像public一樣的修飾符會導致一個單獨的編譯錯誤。我最終使它成爲一個隱含的實現,然後_添加'public':'公共ICollection Keys'。 – 2010-01-27 16:09:42