У меня есть следующий пример кода в консольном приложении 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. Моя проблема с этим решением заключается в том, что базовый класс находится в отдельной сборке, и мне нужно сохранить код, который обрабатывает универсальный тип в этой сборке. И в классе Intermediate есть функциональность, которая не принадлежит сборке с базовым классом.