你可以在VB中inheritance一个带有参数的子新build(构造函数)吗?
在下面的代码中,我收到编译错误
Error Too many arguments to 'Public Sub New()'
Dim TestChild As ChildClass = New ChildClass("c")
。 我在TestChild.Method1()
上没有收到它,即使它们都在我inheritance的基类上。
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
我可以改变孩子类为:
Public Class ChildClass Inherits BaseClass Public Sub New (ByVal SetText As String) MyBase.New(SetText) End Class End Class
如下所示,但我不必为方法1或其他inheritance的方法,我正在寻找最干净的代码可能。 在inheritance参数化新语句的系统中,这可能是一个限制,但我无法在任何地方find它。 如果需要的话,我想看看文档。
你看到的行为是“按devise”。 子类不会从其基类中构造函数。 一个子类负责定义它自己的构造函数。 此外,它必须确保它定义的每个构造函数隐式地或显式地调用基类构造函数,或者链接到另一个相同types的构造函数。
您将需要在所有子类上定义相同的构造函数,并通过MyBase.New显式链接回基础构造函数。 例
Class ChildClass Inherits BaseClass Public Sub New(text As String) MyBase.New(text) End Sub End Class
您正在查找的文档是VB语言规范的第9.3.1节。
我认为最相关的部分是以下(大致开始第二页)
如果一个types不包含实例构造函数声明,则会自动提供一个默认的构造函数。 默认构造函数只是调用直接基types的无参数构造函数。
这并没有明确指出一个子类不会inheritance构造函数,但是这是声明的副作用。
参数化的构造函数不能像实例方法那样被inheritance。 您需要在子类中实现构造函数,然后使用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-超类构造函数调用规则