1

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

我知道我不能像这里讨论的那样覆盖字段。如果我想访问在派生类中初始化的基类中的字段,则解决方案是改用属性。但是如果我想覆盖静态/常量字段(我相信我不能创建静态/常量属性)怎么办?

我试图使示例尽可能简单:

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

是否有另一种选择来执行此操作,而不必将初始化代码复制到所有派生构造函数?(我是真正的程序,我有很多派生类和很多常量)

4

1 回答 1

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

您也可能不想要基类上的默认构造函数。

于 2013-05-11T00:30:00.120 回答