【问题标题】:C# overrididing static variablesC# 覆盖静态变量
【发布时间】:2014-06-27 00:30:24
【问题描述】:

我想执行以下操作,但效果不佳。我错过了什么或哪里出错了?

我有一个基类 (ValueClass),它被其他 2 个类(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}             
    };
}

【问题讨论】:

  • 你不能覆盖静态。
  • 我知道你不能覆盖静态,这就是我寻找替代方案的原因

标签: c# inheritance static


【解决方案1】:

您不能覆盖静态方法/属性/字段。您必须删除静态才能使其正常工作。更好的方法可能是使用 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}             
        };
    }
  }
}

【讨论】:

  • 但我不能使用格式:var _value = ClassB.Get(1); 在不实例化类的情况下获取值。这是我最初的观点。
  • var _value = new ClassB().Get(1); 有什么问题?实例化对象没有什么不好...
  • 我同意 Ian,我只是认为还有另一种实现方式,或者更有效。
  • @DeclanMcD:静态经常被认为是软件中的“反模式”。它们使测试变得异常困难并使您的应用程序紧密耦合,因此如果您真的不需要它们,请不要试图将它们强加到您的体系结构中。至少这是我的建议。
【解决方案2】:

如果您想保持子类值的静态特性,我可能会建议对 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;
        }
    }
}

【讨论】:

  • 这行不通,因为有两个变量叫做 Values
猜你喜欢
  • 1970-01-01
  • 2014-07-22
  • 1970-01-01
  • 2013-10-27
  • 2010-10-10
  • 1970-01-01
  • 2016-03-03
  • 1970-01-01
相关资源
最近更新 更多