Метод пост-создания для обработки инициализации объекта в унаследованных классах - PullRequest
0 голосов
/ 09 октября 2019

Мне интересно услышать ваше мнение о подходе, который я использовал для наследования классов, инициализирующих их базовый класс.

Вот класс коллекции Machines, который содержит список объектов Machine. Каждая машина должна иметь возможность информировать своего родителя, используя делегата, о том, что они делают, но у них нет ссылки на родителя:

Public Delegate Sub MachineDelegate(ByRef item As Machine)

Public MustInherit Class Machines

    Private _items As New List(Of Machine)

    Public Function Create() As Machine
        Dim item As Machine = CreateItem()
        _items.Add(item)
        PostCreationHandler(item)
        Return item
    End Function

    ' Create derived object
    Public MustOverride Function CreateItem() As Machine

    Public Sub ChildMachineDidSomething(ByRef item As Machine)
        ' Handle child object event
        Debug.Print("Machine did something")
    End Sub

    ' Called once object has been created
    Protected Overridable Sub PostCreationHandler(ByRef item As Machine)
        item.MachineDelegate = AddressOf ChildMachineDidSomething
    End Sub

End Class

Public Class Machine
    Public MachineDelegate As MachineDelegate

    Public Sub DoMachineThing()
        If Not MachineDelegate Is Nothing Then MachineDelegate(Me)
    End Sub

End Class

Дочерние объекты будут использовать MachineDelegate для информированияих родитель, передавая себя в качестве ссылки.

Унаследованные классы Cars и Car выглядели бы следующим образом и имели собственный делегат для обработки связанных с Car уведомлений:

Public Delegate Sub CarDelegate(ByRef item As Car)

Public Class Cars
    Inherits Machines

    ' Create derived object
    Public Overrides Function CreateItem() As Machine
        Dim item As Car = New Car
        CreateItem = item
    End Function

    Public Sub ChildCarDidSomething(ByRef item As Car)
        ' Handle child object event
        Debug.Print("Car did something")
    End Sub

    ' Called once object has been created
    Protected Overrides Sub PostCreationHandler(ByRef item As Machine)
        Dim car As Car = item

        MyBase.PostCreationHandler(item)

        car.CarDelegate = AddressOf ChildCarDidSomething

    End Sub

End Class

Public Class Car
    Inherits Machine

    Public CarDelegate As CarDelegate

    Public Sub DoCarThing()
        If Not CarDelegate Is Nothing Then CarDelegate(Me)
    End Sub

End Class

Я создаю переопределяемый PostCreationHandler где специфичная для объекта инициализация должна выполняться после создания объекта, и я использую MyBase.PostCreationHandler, чтобы убедиться, что объект правильно инициализируется на каждом уровне в цепочке наследования.

Моя цель - избежатьдавая дочерним объектам ссылку на их родителя.

Мой вопрос: это нормально, и есть ли лучший подход к этому? Спасибо за чтение и за ваше время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...