虽然不可能创建一个常量属性,但是在使用常量字段时是否有办法避免破坏DRY规则?

时间:2013-05-11 00:26:29

标签: c# inheritance const

例如,我有几个常量在每个派生类中都有不同的值。我想在基类的方法中使用这些值(比如在构造函数中初始化一些非静态字段)。我可以将相同的代码复制粘贴到所有构造函数中进行初始化,但我仍然想知道是否有更好的解决方案。

我知道我无法覆盖字段here。如果我想从派生类中初始化的基类访问字段,则解决方案是使用属性。但是,如果我想覆盖 static / const fields (我相信我不能创建静态/ const属性)该怎么办?

我试图让这个例子变得尽可能简单:

class BaseClass
{
    protected int currentSteps;
}

class ChildClass1 : BaseClass
{
    public const int MAX_STEPS = 5;

    public ChildClass1()
    {
        currentSteps = MAX_STEPS; 
    }
}

class ChildClass2 : BaseClass
{
    public const int MAX_STEPS = 10;

    public ChildClass2()
    {
        currentSteps = MAX_STEPS; 
    }
}

如果我能将它重写为类似的东西以便不重复相同的代码,那对我来说是理想的,但它不会像前面提到的那样工作:

class BaseClass
{
    public const int MAX_STEPS = 0;
    protected int currentSteps;

    public BaseClass()
    {
        currentSteps = MAX_STEPS;
    }
}

class ChildClass1 : BaseClass
{
    public const int MAX_STEPS = 5;
    public ChildClass1() : base() { }
}

class ChildClass2 : BaseClass
{
    public const int MAX_STEPS = 10;
    public ChildClass2() : base() { }
}

是否有另一个选项可以执行此操作而无需将初始化代码复制到所有派生构造函数? (我真正的程序我有很多派生类和许多常量)

1 个答案:

答案 0 :(得分:4)

向受保护的构造函数添加参数可以帮助您实现此目的:

class BaseClass
{
    public const int MAX_STEPS = 0;
    protected int currentSteps;

    public BaseClass() { currentSteps = MAX_STEPS; }
    protected BaseClass(int maxSteps)
    {
        currentSteps = maxSteps;
    }
}

class ChildClass1 : BaseClass
{
    public const int MAX_STEPS = 5;
    public ChildClass1() : base(MAX_STEPS) { }
}

class ChildClass2 : BaseClass
{
    public const int MAX_STEPS = 10;
    public ChildClass2() : base(MAX_STEPS) { }
}

您可能不希望基类上的默认构造函数。