你可以在VB中继承带参数的子新(构造函数)吗?

时间:2009-04-25 22:11:06

标签: vb.net inheritance constructor new-operator

在下面的代码中,我收到编译错误

Error Too many arguments to 'Public Sub New()'
<{1>}上的

。我没有在Dim TestChild As ChildClass = New ChildClass("c")上收到它,即使它们都是我继承的基类。

TestChild.Method1()

我可以将子类更改为:

Public Class BaseClass
    Public ReadOnly Text As String
    Public Sub New(ByVal SetText As String)
        Text = SetText
    End Sub
    Public Sub New()
        Text = ""
    End Sub
End Class

Public Class ChildClass
    Inherits BaseClass
End Class

Public Class TestClass
    Sub Test()
        Dim TestChild As ChildClass = New ChildClass("c")
        TestChild.Method1()
    End Sub
End Class

如下所示,但我没有为方法1或其他继承方法做到这一点,我正在寻找最干净的代码。这可能是继承参数化New语句的系统中的限制,但我无法在任何地方找到它。如果需要,那么我希望看到文档。

2 个答案:

答案 0 :(得分:56)

您看到的行为是“按设计”。子类不是基本类型的inherti构造函数。子类负责定义它自己的构造函数。此外,它必须确保它定义的每个构造函数隐式或显式调用基类构造函数或链到同一类型的另一个构造函数。

您需要在所有子类上定义相同的构造函数,并通过MyBase.New显式链接回基础构造函数。示例

Class ChildClass
  Inherits BaseClass
  Public Sub New(text As String)
    MyBase.New(text)
  End Sub
End Class

您正在寻找的文档是VB语言规范的9.3.1节。

我认为最相关的部分如下(大致是第二页的开头)

  

如果类型不包含实例构造函数声明,则会自动提供默认构造函数。默认构造函数只是调用直接基类型的无参数构造函数。

这没有明确声明子类不会继承构造函数,但它是语句的副作用。

答案 1 :(得分:7)

参数化构造函数不能以与实例方法相同的方式继承。您需要在子类中实现构造函数,然后使用MyBase调用父构造函数。

Public Class ChildClass
    Inherits BaseClass

    Public Sub New (ByVal SetText As String)
      MyBase.New(SetText)
    End Class
End Class

Public Class TestClass
  Public TestChild AS New ChildClass("c")
End Class

此限制不是VB特定的。从我可以收集到的内容来看,它在C#,Java或C ++中绝对不可能。

这是一篇关于C ++的相关问题的相关帖子:
c-superclass-constructor-calling-rules