Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Методы скрытия деталей функционирования класса - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Методы скрытия деталей функционирования класса (Макросы/Sub)
Методы скрытия деталей функционирования класса
dsb75 Дата: Вторник, 29.09.2015, 18:45 | Сообщение № 1
Группа: Пользователи
Ранг: Новичок
Сообщений: 17
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Добрый день,
я пытаюсь написать свой класс, который реализует иерархическую структуру. Скажем, класс, который реализует стандартный элемент этой структуры называется 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 - Вторник, 29.09.2015, 18:50
 
Ответить
СообщениеДобрый день,
я пытаюсь написать свой класс, который реализует иерархическую структуру. Скажем, класс, который реализует стандартный элемент этой структуры называется 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
Дата добавления - 29.09.2015 в 18:45
dsb75 Дата: Вторник, 29.09.2015, 20:00 | Сообщение № 2
Группа: Пользователи
Ранг: Новичок
Сообщений: 17
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Вы точно поняли проблему?
Коллекция потомков естественно тоже есть, то я её не показывал, чтобы не усложнять пример. Проблема с Parent вполне иллюстрирует мои затруднения.


Сообщение отредактировал dsb75 - Вторник, 29.09.2015, 20:11
 
Ответить
СообщениеВы точно поняли проблему?
Коллекция потомков естественно тоже есть, то я её не показывал, чтобы не усложнять пример. Проблема с Parent вполне иллюстрирует мои затруднения.

Автор - dsb75
Дата добавления - 29.09.2015 в 20:00
dsb75 Дата: Вторник, 29.09.2015, 22:26 | Сообщение № 3
Группа: Пользователи
Ранг: Новичок
Сообщений: 17
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
В принципе, есть вариант отказаться от Friend Set свойства и передавать ссылку на родительский объект внутри метода CreateChild...
Вариант, конечно, рабочий, но опять дополнительные телодвижения от пользователя...
 
Ответить
СообщениеВ принципе, есть вариант отказаться от Friend Set свойства и передавать ссылку на родительский объект внутри метода CreateChild...
Вариант, конечно, рабочий, но опять дополнительные телодвижения от пользователя...

Автор - dsb75
Дата добавления - 29.09.2015 в 22:26
miver Дата: Среда, 30.09.2015, 08:34 | Сообщение № 4
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 190
Репутация: 37 ±
Замечаний: 0% ±

Excel 2010
dsb75, посмотрите как другие делают, может подойдет для Вас ;)
treeview
 
Ответить
Сообщениеdsb75, посмотрите как другие делают, может подойдет для Вас ;)
treeview

Автор - miver
Дата добавления - 30.09.2015 в 08:34
dsb75 Дата: Среда, 30.09.2015, 10:21 | Сообщение № 5
Группа: Пользователи
Ранг: Новичок
Сообщений: 17
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
miver, спасибо за пример, посмотрел. Вижу, что автор столкнулся с теми же проблемами и не стал заморачиваться. Наверное, я слишком много хочу от ООП VB6.
 
Ответить
Сообщениеmiver, спасибо за пример, посмотрел. Вижу, что автор столкнулся с теми же проблемами и не стал заморачиваться. Наверное, я слишком много хочу от ООП VB6.

Автор - dsb75
Дата добавления - 30.09.2015 в 10:21
KSV Дата: Среда, 30.09.2015, 18:01 | Сообщение № 6
Группа: Друзья
Ранг: Ветеран
Сообщений: 770
Репутация: 255 ±
Замечаний: 0% ±

Excel 2013
Наверное, я слишком много хочу от ООП VB6.
ну, почему же много?... :)
на ум сразу приходит, как минимум, 2 варианта - в самом классе Node для этих свойств оставить только Property Get (чтоб эти свойства были ридонли), а значения присваивать через события или более культурно - через интерфейс другого класса.


KSV.VBA@gmail.com
Яндекс.Деньги: 410011921213333
 
Ответить
Сообщение
Наверное, я слишком много хочу от ООП VB6.
ну, почему же много?... :)
на ум сразу приходит, как минимум, 2 варианта - в самом классе Node для этих свойств оставить только Property Get (чтоб эти свойства были ридонли), а значения присваивать через события или более культурно - через интерфейс другого класса.

Автор - KSV
Дата добавления - 30.09.2015 в 18:01
dsb75 Дата: Среда, 30.09.2015, 21:06 | Сообщение № 7
Группа: Пользователи
Ранг: Новичок
Сообщений: 17
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
а значения присваивать через события или более культурно - через интерфейс другого класса

Вот с этого места, пожалуйста, подробнее :)
 
Ответить
Сообщение
а значения присваивать через события или более культурно - через интерфейс другого класса

Вот с этого места, пожалуйста, подробнее :)

Автор - dsb75
Дата добавления - 30.09.2015 в 21:06
KSV Дата: Среда, 30.09.2015, 22:57 | Сообщение № 8
Группа: Друзья
Ранг: Ветеран
Сообщений: 770
Репутация: 255 ±
Замечаний: 0% ±

Excel 2013
ну, через события - это совсем просто, думаю, сами разберетесь...
а через интерфейс другого класса см. в файле-примере.
К сообщению приложен файл: Nodes.xlsm (21.7 Kb)


KSV.VBA@gmail.com
Яндекс.Деньги: 410011921213333
 
Ответить
Сообщениену, через события - это совсем просто, думаю, сами разберетесь...
а через интерфейс другого класса см. в файле-примере.

Автор - KSV
Дата добавления - 30.09.2015 в 22:57
dsb75 Дата: Среда, 30.09.2015, 23:01 | Сообщение № 9
Группа: Пользователи
Ранг: Новичок
Сообщений: 17
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
KSV, спасибо! Я вижу тут есть, что покурить. Сходу узнал только custom collection, на которую уже натыкался в процессе изысканий, а вот остальное будем посмотреть.
 
Ответить
СообщениеKSV, спасибо! Я вижу тут есть, что покурить. Сходу узнал только custom collection, на которую уже натыкался в процессе изысканий, а вот остальное будем посмотреть.

Автор - dsb75
Дата добавления - 30.09.2015 в 23:01
dsb75 Дата: Четверг, 01.10.2015, 23:27 | Сообщение № 10
Группа: Пользователи
Ранг: Новичок
Сообщений: 17
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Сергей, очень круто! Я под впечатлением. Не все нюансы понял, но идея улавливается. Сам бы я до такого ни за что не догадался. Книг, которые бы это хорошо объясняли, лично я не видел. Большое вам спасибо за этот приём.

А через события вы всё-таки что имели в виду? Я, наверное, разберусь, но я пока не понял, в чём идея? :)

P.S. Да и крупные точки в комментариях тоже понравились, возьму на вооружение :)
 
Ответить
СообщениеСергей, очень круто! Я под впечатлением. Не все нюансы понял, но идея улавливается. Сам бы я до такого ни за что не догадался. Книг, которые бы это хорошо объясняли, лично я не видел. Большое вам спасибо за этот приём.

А через события вы всё-таки что имели в виду? Я, наверное, разберусь, но я пока не понял, в чём идея? :)

P.S. Да и крупные точки в комментариях тоже понравились, возьму на вооружение :)

Автор - dsb75
Дата добавления - 01.10.2015 в 23:27
dsb75 Дата: Четверг, 01.10.2015, 23:32 | Сообщение № 11
Группа: Пользователи
Ранг: Новичок
Сообщений: 17
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
А через события вы всё-таки что имели в виду?


Пардон, вы там подсказку то дали. Разберусь.
 
Ответить
Сообщение
А через события вы всё-таки что имели в виду?


Пардон, вы там подсказку то дали. Разберусь.

Автор - dsb75
Дата добавления - 01.10.2015 в 23:32
dsb75 Дата: Суббота, 20.05.2017, 21:24 | Сообщение № 12
Группа: Пользователи
Ранг: Новичок
Сообщений: 17
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
KSV, ещё раз хочу вас поблагодарить за тот ваш шикарный совет про интерфейс класса. Я всё-таки вернулся к этой идее, спустя 2 года, и завершил разработку класса, реализующего дерево.
Поскольку я сейчас коммерческой деятельностью не занимаюсь, то, наверное, не будет большим грехом разместить здесь ссылку на него.
 
Ответить
СообщениеKSV, ещё раз хочу вас поблагодарить за тот ваш шикарный совет про интерфейс класса. Я всё-таки вернулся к этой идее, спустя 2 года, и завершил разработку класса, реализующего дерево.
Поскольку я сейчас коммерческой деятельностью не занимаюсь, то, наверное, не будет большим грехом разместить здесь ссылку на него.

Автор - dsb75
Дата добавления - 20.05.2017 в 21:24
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Методы скрытия деталей функционирования класса (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!