Member 11950959 Ответов: 1

Вопрос Vb.net наследство


У меня есть вопрос о наследстве.

У меня есть куча классов, которые динамично отражаются в более крупном проекте во время выполнения. Все классы должны иметь стандартный набор методов и свойств для взаимодействия с этим большим проектом, и много накладных расходов кода аналогично между классами, поэтому у меня есть базовый класс, который обрабатывает свойства и методы, а затем дочерний класс, который заботится о конкретном коде для каждого блока через наследование.

Вот в чем проблема:
В базовом классе есть свойство, называемое "память", объявленное как объект. Это используется внутри дочернего класса для хранения данных, и он должен быть в состоянии содержать любой тип данных, поэтому у меня есть класс под названием "InternalMemory", в который преобразуется это свойство памяти. Это должно происходить одинаково для всех моих дочерних классов, поэтому я хотел бы обработать его в базовом классе, но тип, в который он преобразуется, должен быть определен в дочернем классе. Есть ли какой - нибудь способ сделать это?

Вот несколько упрощенных примеров кода.

Public MustInherit Class BlockOverhead
    Public Property Memory As Object
        Get
            Return BlockMemory
        End Get
        Set(value As Object)
            BlockMemory = value
        End Set
    End Property
    Protected BlockMemory As New Object

    Public Sub TryExecute()
        '==========================================================================
        'Try to import the block memory
        '==========================================================================
        InternalBlockMem = TryCast(BlockMemory, Object.GetType(InternalBlockMem))

        If IsNothing(InternalBlockMem) Then
            InternalBlockMem = New InternalMemory
        End If
        '==========================================================================
        'Try to execute the block
        '==========================================================================
        Execute()

        '==========================================================================
        'Save the block memory
        '==========================================================================
        BlockMemory = New Object
        BlockMemory = InternalBlockMem

    End Sub
    Protected MustOverride Sub Execute()
End Class

Public Class Magic1
    Inherits BlockOverhead
    Public Class InternalMemory
        'Create block's memory vars here.
        Public OutValue1 As Integer
        Public OutValue2 As Boolean
    End Class

    Protected Shadows InternalBlockMem As New InternalMemory
    Protected Overrides Sub Execute()
        'Do some stuff to InternalblockMemory
        InternalBlockMem.OutValue1 = 0
        InternalBlockMem.OutValue2 = True
    End Sub
End Class

Public Class Magic2
    Inherits BlockOverhead
    Public Class InternalMemory
        'Create block's memory vars here.
        Public Test As New List(Of String)
        Public Value As Decimal
    End Class

    Protected Shadows InternalBlockMem As New InternalMemory
    Protected Overrides Sub Execute()
        'Do some stuff to InternalblockMemory
        InternalBlockMem.Test.Clear()
        InternalBlockMem.Test.Add(“Stuff”)
        InternalBlockMem.Value = InternalBlockMem.Value + 1
    End Sub
End Class


Что я уже пробовал:

Я пробовал затенение, но форматирование в базовом классе изменило экземпляр базового класса переменной.

Пробовал Гугл в течение нескольких часов. Там тоже не повезло.

1 Ответов

Рейтинг:
5

Richard Deeming

Похоже, вы ищете дженерики:
Универсальные типы в Visual Basic (Visual Basic) | Microsoft Docs[^]

Public MustInherit Class BlockOverhead(Of TMemory As {Class, New})
    Public Property Memory As TMemory = New TMemory
    
    Public Sub TryExecute()
        Dim myMemory As TMemory = Memory
        If myMemory Is Nothing Then
            myMemory = New TMemory
        End If
        
        Execute(myMemory)
        Memory = myMemory
    End Sub
    
    Protected MustOverride Sub Execute(ByVal memory As TMemory)
End Class

Public Class Magic1
    Inherits BlockOverhead(Of InternalMemory)
    
    Public Class InternalMemory
        Public OutValue1 As Integer
        Public OutValue2 As Boolean
    End Class
    
    Protected Overrides Sub Execute(ByVal memory As InternalMemory)
        memory.OutValue1 = 42
        memory.OutValue2 = True
    End Sub
End Class


Member 11950959

Это именно то, что мне было нужно. Огромное спасибо.