我收到错误:
Error 1 Too many arguments to 'Public Sub New()
“
这让我感到惊讶,因为我认为如果没有在子类S中定义构造函数,那么基类构造函数方法,特别是具有单个整数参数的构造函数将被调用而没有错误。
你知道我为什么会收到这个错误吗?构造函数是一个特例吗?
答案 0 :(得分:6)
类的构造函数仅适用于它定义的类,即使在继承关系中也是如此。为了能够利用你的基类1-arg构造函数,你必须做这样的事情(在C#中):
public class S : B
{
public S()
{
// do something for S
}
public S(int myInt) : base(myInt)
{
// do something for S
}
}
答案 1 :(得分:6)
正如您所怀疑的那样,构造函数不是继承的。子类需要实现自己的构造函数。原因是基类的构造函数不知道如何初始化子类的成员,因此调用它们会使子类对象处于错误状态。
答案 2 :(得分:2)
看起来你正在使用VB。在这种情况下,您需要从子类的构造函数中显式调用适当的基类构造函数。
派生类的实例是 创建,Sub New的构造函数 基类首先执行, 其次是派生的构造函数 类。 Link to page
它调用无参数基类构造函数,但是发送一个整数,因为你不是显式地调用从派生类构造函数接受整数的基类构造函数。
答案 3 :(得分:1)
没有。这是一个不正确的假设。
如果您没有定义构造函数,则添加无参数构造函数。
答案 4 :(得分:1)
这是因为对于任何类,如果没有定义构造函数,编译器会认为存在默认的无参数构造函数。此外,您将无法设置任何私有基类成员,除非在派生类中显式调用基类构造函数。
这是C#代码。 VB应该是类似的。
class B
{
protected int aInt;
private int bInt;
public B()
{ }
public B(int myInt)
{
aInt = myInt;
}
}
class S : B
{
public S(int aInt, int bInt)
: base(bInt)
{
base.aInt = aInt;
}
}
答案 5 :(得分:0)
如果未显式向类中添加构造函数,则默认情况下它具有无参数的空构造函数。我认为这回答了你的问题:)
答案 6 :(得分:0)
通常,基类的构造函数不是公共的。相反,它通常从子类的构造函数调用。
所有类都有一个构造函数,无论您是否定义它们。在您的情况下,我怀疑您对子类的构造函数的调用失败,因为子类中没有定义带有一个参数的构造函数。
答案 7 :(得分:0)
构造函数中的第一个语句必须是mybase.New。原因是所有类都继承自Object类,构造函数必须调用其基类的构造函数。