我想做以下但是它不太有效。我错过了什么或我哪里出错了?
我有一个基类(ValueClass),它由另外两个类(ClassA和ClassB)继承。
在我的代码中,我想执行以下操作:
var _value = ClassB.Get(1);
并返回ValuePair(){Key = 1,Value = 999999999M},但在Get函数中查询时,_Values为空。
我怎样才能做到这一点?
public class ValuePair
{
public int Key;
public decimal Value;
}
public class ValueClass
{
private static List<ValuePair> _Values { get; set; }
public static decimal? Get(int? key)
{
var _result = _Values.Where(i => i.Key == key).FirstOrDefault();
return _result != null ? _result.Value : (decimal?)null;
}
}
public class ClassA : ValueClass
{
private static List<ValuePair> Values=new List<ValuePair>(){
new ValuePair(){Key= 1, Value= 50M},
new ValuePair(){Key= 2, Value= 100M}
};
}
public class ClassB : ValueClass
{
private static List<ValuePair> _Values=new List<ValuePair>(){
new ValuePair(){Key= 1, Value= 999999999M},
new ValuePair(){Key= 2, Value= 25M}
};
}
答案 0 :(得分:5)
您无法覆盖静态方法/属性/字段。您必须删除静态才能使其正常工作。更好的方法可能是使用Abstract类。
Abstract
关键字强制类的所有具体实现实现给定的方法/属性(有点像Interface
)。
public abstract class ValueClass
{
protected abstract List<ValuePair> Values { get; }
public decimal? Get(int? key)
{
var _result = Values.Where(i => i.Key == key).FirstOrDefault();
return _result != null ? _result.Value : (decimal?)null;
}
}
public class ClassA : ValueClass
{
protected override List<ValuePair> Values
{
get { return new List<ValuePair>(){
new ValuePair(){Key= 1, Value= 50M},
new ValuePair(){Key= 2, Value= 100M}
};
}
}
}
public class ClassB : ValueClass
{
protected override List<ValuePair> Values
{
get { return new List<ValuePair>(){
new ValuePair(){Key= 1, Value= 999999999M},
new ValuePair(){Key= 2, Value= 25M}
};
}
}
}
答案 1 :(得分:0)
如果您想保持子类值的静态特性,我可能会向Ian的抽象解决方案提出一点改进:
public class ClassA : ValueClass
{
static List<ValuePair> Values = null;
protected override List<ValuePair> Values
{
get
{
if (Values == null)
{
Values = new List<ValuePair>(){
new ValuePair(){Key= 1, Value= 50M},
new ValuePair(){Key= 2, Value= 100M}
};
}
return Values;
}
}
}
答案 2 :(得分:-1)
您可以为您的超类(基类)使用抽象类,并将您的方法标记为虚拟,以防您需要覆盖它:http://msdn.microsoft.com/en-us/library/ms173150.aspx。
public class SuperClass
{
public virtual void DoWork(int i)
{
//Original implementation.
}
}
public class SubClass : SuperClass
{
public override void DoWork(int i)
{
//New implementation.
}
}