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