【问题标题】:Can a subclass inherit a constructor?子类可以继承构造函数吗?
【发布时间】:2009-06-25 03:33:54
【问题描述】:
  1. 我有一个基类“B”,它有 两个构造函数,一个没有 参数和其他 接受一个参数,一个整数
  2. 我有一个子类“S”,它 继承自“B”并且不 在其中定义任何构造函数。
  3. 我创建了一个 S 的实例, 试图传递给 构造一个整数。

我得到错误:

Error 1 Too many arguments to 'Public Sub New()"

这让我感到惊讶,因为我认为如果没有在子类 S 中定义构造函数,那么基类构造函数方法,特别是具有单个整数参数的构造函数方法将被调用而不会出错。

你知道我为什么会收到这个错误吗?构造函数是特例吗?

【问题讨论】:

  • 我猜是 VB.net(构造函数名称是 New,语法是 VB)。

标签: .net vb.net oop


【解决方案1】:

正如您所怀疑的,构造函数不是继承的。子类需要实现自己的构造函数。原因是基类的构造函数不知道如何初始化子类的成员,因此调用它们会使子类对象处于错误状态。

【讨论】:

  • 最后 3 个答案非常接近,我都投了赞成票,但选择了这个。谢谢!
【解决方案2】:

类的构造函数仅适用于定义它的类,即使在继承关系中也是如此。为了能够利用您的基类 1-arg 构造函数,您必须执行以下操作(在 C# 中):

public class S : B
{
    public S()
    {
        // do something for S
    }

    public S(int myInt) : base(myInt)
    {
        // do something for S
    }
}

【讨论】:

  • 另一个亚军答案。感谢您的回答。
【解决方案3】:

看起来您正在使用 VB。在这种情况下,您需要从子类的构造函数中显式调用相应的基类构造函数。

当派生类的实例是 创建,Sub New 构造函数 基类首先执行, 其次是派生的构造函数 类。 Link to page

它正在调用无参数的基类构造函数,但发送一个整数,因为您没有显式地调用从派生类构造函数接受整数的基类构造函数。

【讨论】:

    【解决方案4】:

    没有。这是一个错误的假设。

    如果不定义构造函数,则添加无参数构造函数。

    【讨论】:

    • 不知道你在说什么我假设不正确。我认为我的假设是正确的。
    【解决方案5】:

    这是因为对于任何类,如果您没有定义构造函数,编译器就会认为存在默认的无参数构造函数。此外,除非在派生类中显式调用基类构造函数,否则您将无法设置任何私有基类成员。

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

    【讨论】:

    • 非常好的pt。我几乎选择了这个作为正确答案。谢谢
    • 谢谢。我试图发布vb代码,但我发现它有点困难并放弃了!
    【解决方案6】:

    如果你没有显式地给一个类添加一个构造函数,那么它默认有一个无参数的空构造函数。我认为这回答了你的问题:)

    【讨论】:

    • 是的,我知道,但这并不能解释为什么我不能在没有映射到它的子类中定义的构造函数的情况下调用基中的构造函数。
    【解决方案7】:

    一般来说基类的构造函数是不公开的。相反,它通常是从子类的构造函数中调用的。

    所有类都有一个构造函数,无论你是否定义它们。在您的情况下,我怀疑您对子类的构造函数的调用失败,因为子类中没有定义带有一个参数的构造函数。

    【讨论】:

    • 不,正如问题所述,基类中有一个接受一个参数的构造函数。看答案。谢谢大家!
    • 我想我没有解释清楚。你同意我的看法。
    【解决方案8】:

    构造函数中的第一条语句必须是 mybase.New。原因是所有类都继承自 Object 类,构造函数必须调用其基类的构造函数。

    【讨论】:

      猜你喜欢
      • 2011-04-21
      • 2016-04-29
      • 1970-01-01
      • 1970-01-01
      • 2015-06-21
      • 1970-01-01
      • 1970-01-01
      • 2018-12-22
      • 2015-03-21
      相关资源
      最近更新 更多