虽然创建常量属性是不可能的,但在使用常量字段时,是否有一种方法可以避免违反dry规则?

本文关键字:常量 一种 方法 可以避免 规则 dry 不可能 属性 创建 字段 是否 | 更新日期: 2023-09-27 18:13:09

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

我知道我不能像这里讨论的那样重写字段。如果我想从基类中访问在派生类中初始化的字段,解决方案是使用属性代替。但是,如果我想重写静态/const字段(我相信我不能创建静态/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() { }
}

是否有另一种方法可以做到这一点,而不必将初始化代码复制到所有派生构造函数?(在真正的程序中我有很多派生类和很多常量)

虽然创建常量属性是不可能的,但在使用常量字段时,是否有一种方法可以避免违反dry规则?

为受保护的构造函数添加参数可以帮助您实现这一点:

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) { }
}

您可能也不想在基类上使用默认构造函数。