【问题标题】:.NET Abstract Class Inheritance and Generics.NET 抽象类继承和泛型
【发布时间】:2023-04-03 05:30:01
【问题描述】:

这是类的布局:

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 进行处理。但我还需要能够在不实例化TestUserATestUserB 的情况下创建TestATestB 的单独实例。

所以我可以这样做:

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

【问题讨论】:

  • 有人能解释一下为什么这个继承结构不起作用吗?我不确定我错过了什么。

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


【解决方案1】:

为您的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

然后将基于泛型的工厂实现放入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

祝你好运!

【讨论】:

  • 这与我试图实现的目标非常接近。大多数其他答案都适用于特定情况。但是这个解决方案适合更大更复杂的 ASP.NET 应用程序。虽然它看起来更复杂,但在我看来,这个解决方案提供了最简单的整体设计。谢谢。
【解决方案2】:

您的 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)

【讨论】:

    【解决方案3】:

    使用不带AsDim,如下所示:

    Dim a = New TestUserA()
    a.DoOtherStuff()
    

    注意:您需要使用Option Strict Off 才能进行上述操作。您还可以使用Option Infer On 来帮助处理上述语法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-05
      • 2010-10-13
      • 1970-01-01
      • 1970-01-01
      • 2012-04-11
      • 2017-02-23
      • 2013-06-10
      • 1970-01-01
      相关资源
      最近更新 更多