这是类的布局:
Public MustInherit Class AbstractBase
Public MustOverride Function GetTest() As String
Public Sub PrintTest()
System.Console.WriteLine(Me.GetTest())
End Sub
End Class
Public Class TestA
Inherits AbstractBase
Public Overrides Function GetTest() As String
Return "Hello from A"
End Function
End Class
Public Class TestB
Inherits AbstractBase
Public Overrides Function GetTest() As String
Return "Hello from B"
End Function
End Class
Public Class TestUser(Of T As AbstractBase)
Public Sub Print()
Dim x As AbstractBase = Activator.CreateInstance(Of T)()
x.PrintTest()
End Sub
End Class
Public Class TestUserA
Inherits TestUser(Of TestA)
''' Custom TestUserA code
End Class
Public Class TestUserB
Inherits TestUser(of TestB)
''' Custom TestUserB Stuff
End Class
这是问题所在:
Dim a As TestUser(Of AbstractBase) = New TestUserA()
编译器说他们TestUserA
无法转换为TestUser(Of AbstractBase)
。我不确定为什么,因为TestUserA
继承自TestUser(Of TestA)
而TestA
继承自AbstractBase
。对我来说,这种继承结构看起来是正确的,所以我不确定为什么这不起作用?
我的想法是AbstractBase
实现了我需要的一些通用功能。 TestUserA
和TestUserB
需要TestA
和TestB
进行处理。但我还需要能够创建TestA
和TestB
的单独实例,而无需实例化TestUserA
或TestUserB
。
所以我可以这样做:
Dim a As TestUser(Of AbstractBase) = New TestUserA()
a.Print()
Dim aTest As New TestA()
Dim x = aTest.GetTest()
Public Function DoThings() As TestUser(Of AbstractBase)
Dim a As TestUser(Of AbstractBase) = New TestUserA()
return a
End Function
答案 0 :(得分:0)
使用不Dim
的{{1}},如下所示:
As
注意:您需要使用Dim a = New TestUserA()
a.DoOtherStuff()
才能使用上述功能。您还可以使用Option Strict Off
来帮助解决上述语法问题。
答案 1 :(得分:0)
为您的TestUser(Of AbstractBase)
引入一个基类来继承自:
Public MustInherit Class TestUser
Public Sub Print()
Dim x As AbstractBase = CreateTest()
x.PrintTest()
End Sub
Protected MustOverride Function CreateTest() As AbstractBase 'IMO the type name should really be AbstractTest not AbstractBase
End Class
然后将基于genrics的工厂实施放入TestUser(Of AbstractBase)
:
Public Class TestUser(Of T As AbstractBase)
Inherits TestUser
Protected Overrides Function CreateTest() As AbstractBase
Return Activator.CreateInstance(Of T)()
End Function
End Class
您的TestUserA和TestUserB未更改。
现在您的主要代码如下所示:
Sub Main()
Dim a As TestUser = New TestUserA()
a.Print()
Dim aTest As New TestA()
Dim x = aTest.GetTest()
End Sub
Public Function DoThings() As TestUser
Dim a As TestUser = New TestUserA()
Return a
End Function
祝你好运!
答案 2 :(得分:0)
您的TestUser类应如下所示:
Public Class TestUser
Public Sub Print(x As AbstractBase)
x.PrintTest()
End Sub
End Class
然后你可以这样打印:
Dim a As AbstractBase = New TestA()
Dim usr As New TestUser
usr.Print(a)