1

たとえば、派生クラスごとに異なる値を持つ定数がいくつかあります。これらの値を基本クラスのメソッドで使用したい (コンストラクターでいくつかの非静的フィールドを初期化するとします)。初期化のために同じコードをコピーしてすべてのコンストラクターに貼り付けることができましたが、より良い解決策があるかどうかはまだ疑問です。

hereで説明されているように、フィールドをオーバーライドできないことはわかっています。派生クラスで初期化された基本クラスのフィールドにアクセスしたい場合、解決策は代わりにプロパティを使用することです。しかし、静的/定数フィールドをオーバーライドしたい場合はどうすればよいでしょうか(静的/定数プロパティを作成できないと思います)。

例をできるだけ単純にしようとしました。

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 に答える