在C#中的子类中初始化父类数组成员

时间:2017-09-03 18:02:17

标签: c# inheritance

是否有可能在C#中编写实际可行的内容(编译并运行,但不能正常工作)?

public abstract class Foo
{
    public int[] a;
}

public class Bar : Foo
{
    public int[] a = new int[123];
}

或者我是否必须使用它(工作正常,但不像上面的代码那样好)?

public abstract class Foo
{
    public int[] a;

    public void Init(int size)
    {
        a = new int[size];
    }
}

public class Bar : Foo
{
    public Bar()
    {
        Init(123);
    }
}

2 个答案:

答案 0 :(得分:2)

Bar.a隐藏了继承的基本成员(Foo.a)。为了使其正常工作,首先,您需要将基本成员从字段更改为属性,其次将其声明为abstract,然后override它在你的派生类中。像这样:

public abstract class Foo
{
    public abstract int[] a { get; set; }
}

public class Bar : Foo
{
    public override int[] a { get; set; }
}

或者如果您只想让子类设置数组大小在派生类中使用constructor,如下所示:

public abstract class Foo
{
    public int[] a;
}

public class Bar : Foo
{
    public Bar()
    {
        a = new int[123];
    }  
}

答案 1 :(得分:2)

根据您的评论:

  

目的是让子类设置数组大小。

听起来您正在寻找的是构造函数。您可以使用它来定义创建对象实例所需的值,并使用这些值来构建对象。

您的基类需要值,如下所示:

public abstract class Foo
{
    public int[] a;

    public Foo(int size)
    {
        a = new int[size];
    }
}

所以现在一个需要来提供构造函数的值。子类可以使用构造函数链接轻松地从自己的构造函数提供值:

public class Bar : Foo
{
    public Bar(int size) : base(size) { }
}