2012-04-22 30 views
0

我在C#这样的类:Overiding不断

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; 

} 

我想accopmlish是创建数组的大小一栏实例从overrided SIZE取值。如何正确地做到这一点?

+0

您可以在构造函数中设置只读参数,但可能不是静态只读,因为它需要在不带参数的静态构造函数中设置。 – kenny 2012-04-22 11:04:40

回答

3

你不能这样做。你可以使用一个虚拟的方法:

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

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

它也可以使用反射来寻找一个静态字段SIZE,但我不建议。

2

您的SIZE常量是静态的,并且静态字段不会被继承 - Foo.SIZE和Bar.SIZE是两个不同的常量,它们之间没有任何关系。这就是为什么Foo的构造函数的调用将始终以2初始化,不是4

你可以做的就是创建Foo中protected virtual void Initialize()方法初始化与阵列2,并覆盖它在酒吧与4

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”的类的值。

+1

-1您不能在字段上放置虚拟和覆盖。而是使用属性或方法来返回值。 – base2 2012-04-22 11:07:19

+0

公平警察,改为使用属性 – 2012-04-22 11:10:52