Vb.net Public MustOverride sub new(参数作为类型)

Vb.net Public MustOverride sub new(参数作为类型),vb.net,overriding,Vb.net,Overriding,我有一个名为ParentClass的MustInherit类。 我需要能够在不同的地方写下以下内容: Function TheThing(Of T As ParentClass)(s As String) As ParentClass Return New T(s) End Function 因此,我要写信 MustInherit Class ParentClass MustOverride Sub New(s As String) End Class Class Class_

我有一个名为ParentClass的MustInherit类。 我需要能够在不同的地方写下以下内容:

Function TheThing(Of T As ParentClass)(s As String) As ParentClass
    Return New T(s)
End Function
因此,我要写信

MustInherit Class ParentClass
    MustOverride Sub New(s As String)
End Class
Class Class_Daughter1
    Inherits ParentClass
    Overrides Sub New(s As String)
        'do whatever
    End Sub
End Class
事实上:

  • 如果我没有声明MustOverride sub new(s为string),那么函数TheThing不知道从ParentClass派生的任何类都有sub new(s为string)
  • 如果我添加了它,它会说新的不能被覆盖
有办法吗?我试着用一个工具,但也没有成功

PS:如果我只使用

Function TheThing(Of T As ParentClass)(s As String) As ParentClass
    dim a as new T()
    Return a
End Function
新的那条线也不行

PS2:这也是不允许的:

Function TheThing(Of T As {ParentClass, iCreatable})(s As String) As ParentClass
    Return New T(s)
End Function
Interface iCreatable
    Sub New() '===> not allowed in interface
End Interface

类的构造函数不能是MustInherit,但如果您想做一些基本相同的事情,可以这样做:

MustInherit Class ParentClass
    Protected Sub New(s As String)
        Initialize(s)
    End Sub

    Protected MustOverride Sub Initialize()

End Class
您的子类的构造函数必须调用
MyBase.New
。通过这种方式,需要子类来实现初始化,并且由于需要子类来调用基类构造函数,因此可以保证将调用Initialize。

我刚刚得到了答案(来自朋友):

唯一我无法解决的问题是:我无法编写以下内容(classier,但如果编译它,它将是等效的):


谢谢你的回答。事实上,这确保了新计划的实施。。。但编译器仍然认为类型T可能无法实现新的。是否有接口(如iComparable、iConvertible…)thant表示“可以创建”?通过使父类只有一个构造函数,并且该构造函数具有参数,任何继承类都必须有自己的构造函数,该构造函数调用提供参数的基类构造函数。您好,这是真的。。。但编译器并不理解它。检查我自己的答案,查看我找到的解决方法:)
Function TheThing(Of T As {New, ParentClass})(s As String) As ParentClass
    Dim res As New T()
    res.Init(s)
    Return res
End Function

MustInherit Class ParentClass
    MustOverride Sub Init(s As String)
End Class

Class Class_Daughter1
    Inherits ParentClass
    Overrides Sub Init(s As String)
        'do whatever
    End Sub
End Class
Function TheThing(Of T As {New(s as string), ParentClass})(s As String) As ParentClass
    return New T(s)
End Function

MustInherit Class ParentClass
    'nothing here
End Class

Class Class_Daughter1
    Inherits ParentClass
    public Sub New(s As String)
        'do whatever
    End Sub
End Class