我知道这似乎是一个有用的功能“在设计时”,但想象一下如何使用它:
如果GetForms 是Shared(C# 中的static),则您没有具有类型的对象来区分使用哪种方法,即您不能以某种方式说出BaseForm.GetForms(),它可以确定实际调用了ChildFormTypeA.GetForms() 和ChildFormTypeB.GetForms() 中的哪一个。
如果您只想显式调用ChildFormTypeA.GetForms() 和ChildFormTypeB.GetForms(),或者如果您真的需要这个概念,请将其设为工厂方法,例如
MustInherit Class BaseForm
MustOverride Sub GetForms()
End Class
Class MyForm
Inherits BaseForm
Public Sub New()
End Sub
Overrides Sub GetForms()
End Sub
End Class
现在你只需要
Dim f as BaseForm = New MyForm
f.GetForms
或者GetForms 可能是Protected 并从Sub New 调用。
编辑:这几乎是一个新答案。
我只是在维护现有代码时需要这个。我决定最简单的方法是让两个类都实现一个接口:
Interface ISharedNew
Function SharedNew(ByVal Argument As String) As ISharedNew
End Interface
(在这种情况下,我已经通过泛型约束 T As New 使用了这些类,并且我需要构造函数现在具有泛型约束不支持的参数。)
新的(简化的)通用代码现在是:
Function GetNew(Of T As {New, ISharedNew})(ByVal Argument As String) As T
Return DirectCast((New T).SharedNew(Argument), T)
End Function
在我的例子中,New T 对象本身被SharedNew 忽略,但它的类型确实指定了SharedNew 的相关实例,它使用Argument 创建了一个新的T 对象。
代码已从头开始添加到此答案中,未引用实际代码。