C#重写静态变量

时间:2014-06-26 16:00:21

标签: c# inheritance static

我想做以下但是它不太有效。我错过了什么或我哪里出错了?

我有一个基类(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}             
    };
}

3 个答案:

答案 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.
    }
}