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

Ben*_*vis 41 vb.net inheritance constructor new-operator

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

Error Too many arguments to 'Public Sub New()'
Run Code Online (Sandbox Code Playgroud)

在...上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
Run Code Online (Sandbox Code Playgroud)

我可以将子类更改为:

Public Class ChildClass
    Inherits BaseClass
      Public Sub New (ByVal SetText As String)
      MyBase.New(SetText)
    End Class
End Class
Run Code Online (Sandbox Code Playgroud)

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

Jar*_*Par 57

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

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

Class ChildClass
  Inherits BaseClass
  Public Sub New(text As String)
    MyBase.New(text)
  End Sub
End Class
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

  • 单击文档链接后,现在将产生一个带有“ Visual Studio 2003退休技术文档”文本的页面。 (2认同)

Jos*_*lio 8

参数化构造函数不能以与实例方法相同的方式继承.您需要在子类中实现构造函数,然后使用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
Run Code Online (Sandbox Code Playgroud)

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

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