【问题标题】:Public MustOverride sub new(Param as type)Public MustOverride sub new(Param as type)
【发布时间】:2017-11-06 17:36:42
【问题描述】:

我有一个名为 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 as string) ,那么函数 TheThing 不知道任何从 ParentClass 派生的类确实有一个 sub new(s as string)
  • 如果我确实添加了它,那么它说 new 不能被必须覆盖

有没有办法做到这一点?我尝试使用工具,但也没有成功...

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

【问题讨论】:

    标签: vb.net overriding


    【解决方案1】:

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

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

    您的 Daughter 类的构造函数必须调用 MyBase.New(s)。这种方式需要子类来实现初始化,并且由于子类需要调用基类的构造函数,所以保证会调用 Initialize。

    【讨论】:

    • 感谢您的回答。事实上,这确保了新的实现......但编译器仍然认为类型 T 可能不会实现新的。是否有一个接口(如 iComparable、iConvertible ...)thant 的意思是“可以创建”?
    • 通过使 ParentClass 只有一个构造函数并且该构造函数具有参数,任何继承的类必须具有自己的构造函数,该构造函数调用提供参数的基类构造函数。
    • 嗨,这是真的……但编译器不理解它。检查我自己的答案以查看我找到的解决方法:)
    【解决方案2】:

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

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-03
      • 1970-01-01
      • 1970-01-01
      • 2018-08-31
      • 2011-02-14
      • 2011-12-08
      • 2017-05-12
      • 1970-01-01
      相关资源
      最近更新 更多