Добрый день, я пытаюсь написать свой класс, который реализует иерархическую структуру. Скажем, класс, который реализует стандартный элемент этой структуры называется Node. Иерархия - это, когда есть родительский элемент и какое-то количество дочерних. То есть внутри класса будут ссылки (указатели) на экземпляры класса того же типа родителя и детей. Для простоты обсудим свойство Parent.
У меня сейчас реализовано так: Node.cls [vba]
Код
Private pParent As Node
Public Property Get Parent() As Node Set Parent = pParent End Property
Friend Property Set Parent(oNode As Node) Set pParent = oNode End Property
Public Function CreateChild(sName As String) As Node ' ... Set CreateChild.Parent = Me ' ... End Function
[/vba]
Для чего я объявил свойство Set с кодовым словом Friend? Дело в том, что свойство Parent я должен устанавливать для другого экземпляра класса Node (по причине, что это иерархическая структура).
Мне не нравится, что я открываю свойство Parent на запись для проекта. Хотелось бы, чтобы это свойство было только по Get, а устанавливалось только внутри класса Node. Прошу совета, как это правильно реализовать? С детьми та же история, но ещё хуже - там приходится светить уже ссылку на коллекцию - и это тоже расстраивает.
Добрый день, я пытаюсь написать свой класс, который реализует иерархическую структуру. Скажем, класс, который реализует стандартный элемент этой структуры называется Node. Иерархия - это, когда есть родительский элемент и какое-то количество дочерних. То есть внутри класса будут ссылки (указатели) на экземпляры класса того же типа родителя и детей. Для простоты обсудим свойство Parent.
У меня сейчас реализовано так: Node.cls [vba]
Код
Private pParent As Node
Public Property Get Parent() As Node Set Parent = pParent End Property
Friend Property Set Parent(oNode As Node) Set pParent = oNode End Property
Public Function CreateChild(sName As String) As Node ' ... Set CreateChild.Parent = Me ' ... End Function
[/vba]
Для чего я объявил свойство Set с кодовым словом Friend? Дело в том, что свойство Parent я должен устанавливать для другого экземпляра класса Node (по причине, что это иерархическая структура).
Мне не нравится, что я открываю свойство Parent на запись для проекта. Хотелось бы, чтобы это свойство было только по Get, а устанавливалось только внутри класса Node. Прошу совета, как это правильно реализовать? С детьми та же история, но ещё хуже - там приходится светить уже ссылку на коллекцию - и это тоже расстраивает.dsb75
Сообщение отредактировал dsb75 - Вторник, 29.09.2015, 18:50
Вы точно поняли проблему? Коллекция потомков естественно тоже есть, то я её не показывал, чтобы не усложнять пример. Проблема с Parent вполне иллюстрирует мои затруднения.
Вы точно поняли проблему? Коллекция потомков естественно тоже есть, то я её не показывал, чтобы не усложнять пример. Проблема с Parent вполне иллюстрирует мои затруднения.dsb75
Сообщение отредактировал dsb75 - Вторник, 29.09.2015, 20:11
В принципе, есть вариант отказаться от Friend Set свойства и передавать ссылку на родительский объект внутри метода CreateChild... Вариант, конечно, рабочий, но опять дополнительные телодвижения от пользователя...
В принципе, есть вариант отказаться от Friend Set свойства и передавать ссылку на родительский объект внутри метода CreateChild... Вариант, конечно, рабочий, но опять дополнительные телодвижения от пользователя...dsb75
miver, спасибо за пример, посмотрел. Вижу, что автор столкнулся с теми же проблемами и не стал заморачиваться. Наверное, я слишком много хочу от ООП VB6.
miver, спасибо за пример, посмотрел. Вижу, что автор столкнулся с теми же проблемами и не стал заморачиваться. Наверное, я слишком много хочу от ООП VB6.dsb75
ну, почему же много?... на ум сразу приходит, как минимум, 2 варианта - в самом классе Node для этих свойств оставить только Property Get (чтоб эти свойства были ридонли), а значения присваивать через события или более культурно - через интерфейс другого класса.
ну, почему же много?... на ум сразу приходит, как минимум, 2 варианта - в самом классе Node для этих свойств оставить только Property Get (чтоб эти свойства были ридонли), а значения присваивать через события или более культурно - через интерфейс другого класса.KSV
KSV, спасибо! Я вижу тут есть, что покурить. Сходу узнал только custom collection, на которую уже натыкался в процессе изысканий, а вот остальное будем посмотреть.
KSV, спасибо! Я вижу тут есть, что покурить. Сходу узнал только custom collection, на которую уже натыкался в процессе изысканий, а вот остальное будем посмотреть.dsb75
Сергей, очень круто! Я под впечатлением. Не все нюансы понял, но идея улавливается. Сам бы я до такого ни за что не догадался. Книг, которые бы это хорошо объясняли, лично я не видел. Большое вам спасибо за этот приём.
А через события вы всё-таки что имели в виду? Я, наверное, разберусь, но я пока не понял, в чём идея?
P.S. Да и крупные точки в комментариях тоже понравились, возьму на вооружение
Сергей, очень круто! Я под впечатлением. Не все нюансы понял, но идея улавливается. Сам бы я до такого ни за что не догадался. Книг, которые бы это хорошо объясняли, лично я не видел. Большое вам спасибо за этот приём.
А через события вы всё-таки что имели в виду? Я, наверное, разберусь, но я пока не понял, в чём идея?
P.S. Да и крупные точки в комментариях тоже понравились, возьму на вооружение dsb75
KSV, ещё раз хочу вас поблагодарить за тот ваш шикарный совет про интерфейс класса. Я всё-таки вернулся к этой идее, спустя 2 года, и завершил разработку класса, реализующего дерево. Поскольку я сейчас коммерческой деятельностью не занимаюсь, то, наверное, не будет большим грехом разместить здесь ссылку на него.
KSV, ещё раз хочу вас поблагодарить за тот ваш шикарный совет про интерфейс класса. Я всё-таки вернулся к этой идее, спустя 2 года, и завершил разработку класса, реализующего дерево. Поскольку я сейчас коммерческой деятельностью не занимаюсь, то, наверное, не будет большим грехом разместить здесь ссылку на него.dsb75