是否有可能在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);
}
}
答案 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) { }
}