2010-11-17 76 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 [“结果”]将包含预期结果。