【问题标题】:Can I inherit from a generic class without specifying a type?我可以从泛型类继承而不指定类型吗?
【发布时间】:2010-10-22 17:37:06
【问题描述】:

我在 VB.NET 控制台应用程序中有以下示例代码。它编译和工作,但感觉就像一个黑客。有没有办法定义 EmptyChild 以便它从 Intermediate(Of T As Class) 继承而不使用虚拟 EmptyClass?

Module Module1
Sub Main()

    Dim Child1 = New RealChild()
    Child1.Content = New RealClass()
    Dim Child2 = New EmptyChild()

    Console.WriteLine("RealChild says: " & Child1.Test)
    Console.WriteLine("EmptyChild says: " & Child2.Test)
    Console.ReadLine()
End Sub

Public Class EmptyClass

End Class

Public Class RealClass

    Public Overrides Function ToString() As String
        Return "This is the RealClass"
    End Function

End Class

Public MustInherit Class Base(Of T As Class)

    Private _content As T = Nothing
    Public Property Content() As T
        Get
            Return _content
        End Get
        Set(ByVal value As T)
            _content = value
        End Set
    End Property

    Public Overridable Function Test() As String
        If Me._content IsNot Nothing Then
            Return Me._content.ToString
        Else
            Return "Content not initialized."
        End If
    End Function

End Class

Public MustInherit Class Intermediate(Of T As Class)
    Inherits Base(Of T)

    'some methods/properties here needed by Child classes

End Class

Public Class RealChild
    Inherits Intermediate(Of RealClass)

    'This class needs all functionality from Intermediate.

End Class

Public Class EmptyChild
    Inherits Intermediate(Of EmptyClass)

    'This class needs some functionality from Intermediate,
    ' but not the Content as T property.

    Public Overrides Function Test() As String
        Return "We don't care about Content property or Type T here."
    End Function

End Class
End Module

另一种方法是将通用代码移出基类,然后创建 2 个中间类,如下所示:

Public MustInherit Class Intermediate
    Inherits Base

    'some methods/properties here needed by Child classes

End Class

Public MustInherit Class Intermediate(Of T As Class)
    Inherits Intermediate

    'implement generic Content property here

End Class

然后 RealChild 将继承自泛型 Intermediate,而 EmptyChild 将继承自非泛型 Intermediate。我对该解决方案的问题是 Base 类位于单独的程序集中,我需要保留处理该程序集中泛型类型的代码。并且中间类中有一些功能不属于与基类的程序集。

【问题讨论】:

    标签: vb.net generics inheritance


    【解决方案1】:

    是的,您需要在继承时指定类型参数,或者您的 EmptyChild 也必须是泛型的。但是,您不必虚设一个 EmptyClass - 只需使用 Object 作为您的类型参数:

     Public Class EmptyClass
        Inherits Intermediate(Of Object)
     End Class
    

    【讨论】:

    • 谢谢!我以为我尝试过使用 Object 但它不起作用,但现在我发现它确实起作用了。
    猜你喜欢
    • 2011-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-16
    • 2019-07-11
    • 2011-12-11
    • 2018-09-27
    相关资源
    最近更新 更多