Pergunta

Eu tenho o seguinte código de amostra em um aplicativo de console VB.NET. Ele compila e funciona, mas parece um hack. Existe uma maneira de definir o StawtChild para que ele herde do intermediário (de T como classe) sem usar o esvaziamento fictício?

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

A outra maneira de fazer isso seria mover o código genérico para fora da classe base e, em seguida, criar 2 classes intermediárias como esta:

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

Em seguida, o RealChild herdaria do intermediário genérico e do Stawardchild herdaria do intermediário não genérico. Meu problema com essa solução é que a classe base está em uma montagem separada e preciso manter o código que lida com o tipo genérico nesse conjunto. E há funcionalidade na classe intermediária que não pertence à montagem com a classe base.

Foi útil?

Solução

Sim, você precisa especificar um parâmetro de tipo quando herdar, ou o seu emptychild também deve ser genérico. Mas, você não precisa contratar um esvaziamento - basta usar o objeto como seu parâmetro de tipo:

 Public Class EmptyClass
    Inherits Intermediate(Of Object)
 End Class
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top