.NET抽象类继承和泛型

时间:2013-09-06 14:09:18

标签: c# .net vb.net inheritance abstract-class

这是类的布局:

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实现了我需要的一些通用功能。 TestUserATestUserB需要TestATestB进行处理。但我还需要能够创建TestATestB的单独实例,而无需实例化TestUserATestUserB

所以我可以这样做:

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

3 个答案:

答案 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)