У меня есть родительский элемент управления, который создает дочерние элементы управления, что, в свою очередь, может создавать дополнительные дочерние элементы. Каков наилучший способ передачи команд или значений от внука обратно в верхний родительский элемент управления? Рассмотрим этот пример:
У дочернего элемента управления есть кнопка для удаления самой себя. Но метод фактического удаления, удаления из GUI, et c., Все обрабатывается верхним родителем по необходимости.
Вот два способа, которыми я способствовал, оба из которых работают:
- Когда родитель создает экземпляр дочернего объекта, он передает ссылку на самого себя этому дочернему элементу. Это позволяет ребенку теперь вызывать publi c членов родителя. В коде это будет выглядеть примерно так:
'*~*~*~*~*~*~*~*~*~*~
'in the parent object
Dim child as new ChildObject
child.setParent(me)
'*~*~*~*~*~*~*~*~*~*~
'in the child object
public sub setParent(byref p as parentObject)
myParent = p
end sub
'now the child can interact with the parent
'for example:
myParent.deleteMe()
Это работает нормально, когда есть глубина одного уровня. Но в тех случаях, когда у вас есть несколько уровней, это неуклюже, и вы будете делать что-то вроде:
myParent.myParent.myParent.deleteMe()
Не круто.
Другой способ, которым я способствовал, это переменная publi c, которая отслеживается высокоскоростным таймером в верхнем родительском элементе. Если дочернему элементу требуется запуск какого-либо родительского метода, он устанавливает флаг bool в значение TRUE, которое отслеживает таймер, а затем вызывает соответствующий метод. Но это влечет за собой переменную publi c, которую я бы предпочел избегать. Этот метод также использует непрерывный таймер, который потребляет ресурсы.
Вопрос:
Являются ли эти приемлемые способы достижения цели sh? Есть ли способ лучше? Или тот факт, что мне даже нужно сделать это, указывает на общий недостаток дизайна?