类继承 - 字典中的多个类类型

时间:2013-12-05 03:19:46

标签: c#

我试图理解为什么zList [“B”]。值在下面的例子中不打印555.666。

我正在尝试创建一个可以返回不同类型的类字典,但我不太清楚如何去做。

    class Program
    {
        static void Main(string[] args)
        {

            Dictionary<string, BaseClass> zList = new Dictionary<string, BaseClass>();
            ClassA zA = new ClassA();
            zA.Value = "Test";
            zList["A"] = zA;

            ClassB zB = new ClassB();
            zB.Value = 555.666;
            zList["B"] = zB;


            Console.WriteLine(zList["A"].Value);
            Console.WriteLine(zList["B"].Value);

            Console.ReadLine();

        }
    }

    public class BaseClass
    {
        private string _value;

        public string Value
        {
            get { return _value; }
            set { _value = value; }
        }
    }

    public class ClassA : BaseClass
    {

    }

    public class ClassB : BaseClass
    {
        private new double _value;

        public new double Value
        {
            get { return _value; }
            set { _value = value; }
        }
    }

4 个答案:

答案 0 :(得分:4)

您在new的属性定义中使用Value。您想在Value BaseClassvirtual,然后overrideClassB。{/ p>

基本上,正在发生的事情是您使用自己的属性隐藏了基础的Value属性,并且当它在基础上被调用时,它实际上没有值,因为它不包含{{ 1}}字段或ClassB._value属性。

编辑: 我错过了你也宣布了一种不同的类型。您无法覆盖并提供其他类型。如果要从基类调用它,则需要提供不同的名称或机制来返回特定类型。您可能希望使用泛型来执行您想要的操作,并在基类上使用ClassB.Value属性。

答案 1 :(得分:2)

  

我试图理解为什么zList [“B”]。值在下面的例子中不打印555.666。

因为字典的索引[]运算符返回BaseClass,所以编译器知道的唯一Value类型是string类型。 double Value属性不会覆盖它 - 它除了string之外。

  

我正在尝试创建一个可以返回不同类型的类字典

使用接口而不是基类,放置类型为object的属性,并放置不同的实现,如下所示:

interface WithValue {
    object Value {get;set;}
}
public ClassA : WithValue {
    private string _value;
    object Value {
        get {return _value;}
        set {_value = (string)value;}
    }
}
public ClassB : WithValue {
    private double _value;
    object Value {
        get {return _value;}
        set {_value = (double)value;}
    }
}

现在,您Main的代码应该可以正常运行:

Dictionary<string,WithValue> zList = new Dictionary<string,WithValue>();
ClassA zA = new ClassA();
zA.Value = "Test";
zList["A"] = zA;

ClassB zB = new ClassB();
zB.Value = 555.666;
zList["B"] = zB;

Console.WriteLine(zList["A"].Value);
Console.WriteLine(zList["B"].Value);

答案 2 :(得分:0)

因为Dictionary的类型为BaseClass。因此,它推断您正在寻找Value中声明的BaseClass

答案 3 :(得分:0)

由于Base类无权访问派生类属性,因此显示的值是基类的值(为null)。请考虑以下代码,以便能够显示所需的值...

    static void Main(string[] args)
    {

        Dictionary<string, BaseClass> zList = new Dictionary<string, BaseClass>();
        ClassA zA = new ClassA();
        zA.Value = "Test";
        zList["A"] = zA;

        ClassB zB = new ClassB();
        zB.Value = 555.666;
        zList["B"] = zB;


        Console.WriteLine(zList["A"].Value);
        Console.WriteLine(zList["B"].Value);

        Console.ReadLine();

    }
}

public class BaseClass
{
    protected string _value;

    public string Value
    {
        get { return _value; }
        set { _value = value; }
    }
}

public class ClassA : BaseClass
{

}

public class ClassB : BaseClass
{
    private new double _value1;

    public new double Value
    {
        get { return _value1; }
        set { _value1 = value; _value = value.ToString(); }
    }
}

祝你好运!