0

私はC#でそのようなクラスを持っています:

public class Foo 
{
    public static readonly int SIZE = 2;
    private int[] array;

    public Foo
    {
        array = new int[SIZE];
    }

}

およびBarクラス:

public class Bar : Foo
{
    public static readonly int SIZE = 4;

}

私が達成したいのは、オーバーライドされたSIZE値から配列サイズを取得して Bar インスタンスを作成することです。適切に行う方法は?

4

3 に答える 3

3

このようにすることはできません。仮想メソッドを使用できます。

public class Foo 
{
    protected virtual int GetSize(){return 2;};
    private int[] array;

    public Foo
    {
        array = new int[GetSize()];
    }
}

リフレクションを使用して静的フィールドを探すこともできますが、SIZEお勧めしません。

于 2012-04-22T11:02:12.047 に答える
2

SIZE 定数は静的であり、静的フィールドは継承されません。Foo.SIZE と Bar.SIZE は、互いに何の関係もない 2 つの異なる定数です。そのため、Foo のコンストラクター呼び出しは常に 4 ではなく 2 で初期化されます。

できることはprotected virtual void Initialize()、Foo で配列を 2 で初期化するメソッドを作成し、それを Bar でオーバーライドして 4 で初期化することです。

于 2012-04-22T11:04:26.693 に答える
0

static フィールドは継承できません。代わりに以下を使用します。

public class Foo
{
    protected virtual int SIZE
    {
        get
        {
            return 2;
        }
    }

    private int[] array;

    public Foo()
    {
        array = new int[SIZE];
    }
}

public class Bar : Foo
{
    protected override int SIZE
    {
        get
        {
            return 4;
        }
    }
}

Virtual は、「これは基本クラスのデフォルト値です」と言っているようなものです。一方、Override は「Foo」を実装するクラスの値を変更します。

于 2012-04-22T11:05:43.097 に答える