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;

}

我想要完成的是创建一个 Bar 实例,其数组大小取自覆盖SIZE值。如何正确地做到这一点?

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 是两个彼此无关的不同常量。这就是为什么 Foo 的构造函数调用总是用 2 而不是 4 来初始化。

您可以做的是protected virtual void Initialize()在 Foo 中创建一个用 2 初始化数组的方法,并在 Bar 中覆盖它以用 4 初始化它。

于 2012-04-22T11:04:26.693 回答
0

您不能继承静态字段;而是使用以下内容:

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;
        }
    }
}

虚拟就像说“这是基类的默认值”;而 Override 改变了实现“Foo”的类的值。

于 2012-04-22T11:05:43.097 回答