2010-11-17 71 views
0

C#的問題我有一個具有以下屬性的基類:與覆蓋

public virtual Dictionary<String, int> activity 
    { 
     get; 
     set; 

    } 

派生類重寫此爲這樣:

Dictionary<string, int> myActivity = new Dictionary<string, int>() 
    { 
     {"result", 5}, 
     {"total", 6} 
    }; 


    public override Dictionary<string, int> activity 
    { 
     get 
     { 
      return myActivity; 
     } 

    } 

我想打電話給倍率字典從內基類相同的組件,但不同的類。

因此,例如,從Class2中我想打電話:

Class1 c = new Class1(); 

,然後嘗試訪問字典這樣:

c.activity["result"] 

我得到一個錯誤說這不是字典中?

派生類在另一個程序集... dll文件中。

任何想法?

謝謝。

+4

Class1是基類還是派生類? – 2010-11-17 13:04:04

+0

Class1是父類還是子類?您的示例不顯示哪個代碼與哪個類名稱一起使用。 – 2010-11-17 13:04:17

+0

是Class1基類還是派生類? – 2010-11-17 13:04:19

回答

2
Class1 c = new Class2(); 
c.activity["result"] 

會工作,你不會在Class1的

1

它不聽起來像Class1 c = new Class1();是同一個實例類,你必須實例化Dictionary

爲了能夠使用的值來訪問Dictionary財產,你已經實例化的類必須是該實例化類Dictionary或從它派生的類。

+0

嗨,我忘了提及,overriden屬性實際上是在另一個程序集中...... a DLL文件。 – 2010-11-17 13:11:47

+1

@達倫議會無關緊要,財產是該事務的成員。 如果您創建基類ClassA並且有2個類從它繼承ClassB和ClassC,則ClassC將看不到在ClassB中被重寫的屬性。 更重要的是,ClassB的2個實例不會看到屬性的相同實例。 – TimC 2010-11-17 16:15:55

0

覆蓋活動場所在Class2中如果你沒有在Class1的聲明的字典實例,然後標記屬性的抽象。如果你這樣做,那麼只需將值「結果」添加到它。仔細考慮誰擁有Class1和Class2之間的數據。事實上,如果Class1不打算實際分配任何數據,那麼它可能只是一個接口。

0

你已經創建了一個Class1的實例,如果我正確地解釋了這個問題,那麼你的基類(包括類聲明會有幫助)。爲了讓你的對象c使用Class2中的字典,它需要被創建爲Class2的一個實例。然後

您的代碼應該是這樣的:

基類:

class Class1 
{ 
    public virtual Dictionary<String, int> activity 
    { 
     get; 
     set; 
    } 
} 

派生類:

class Class2 
{ 
    Dictionary<string, int> myActivity = new Dictionary<string, int>() 
    { 
     {"result", 5}, 
     {"total", 6} 
    }; 


    public override Dictionary<string, int> activity 
    { 
     get 
     { 
      return myActivity; 
     } 

    } 
} 

然後調用代碼

Class1 c = new Class2(); 

在這POIN t,c.activity [「結果」]將包含預期結果。