我试图理解为什么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; }
}
}
答案 0 :(得分:4)
您在new
的属性定义中使用Value
。您想在Value
BaseClass
上virtual
,然后override
上ClassB
。{/ 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(); }
}
}
祝你好运!