| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Общие вопросы по .NET и C# > Как родителю менять св-во Parent дочернего класса |
| Автор: 0leg 5.12.2006, 16:23 |
| У многих классов NET есть свойство Parent, доступное только для чтения. Как родительские классы записывают в него значение? Хочу сделать также! Ни конструкторов ни методов для установки Parent я не нашел. |
| Автор: ivashkanet 5.12.2006, 16:29 |
| 0leg, какие именно классы тебя интересуют |
| Автор: 0leg 5.12.2006, 16:40 |
Из существующих - TreeNode.Parent например. Меня интересует, могу ли я в своих классах сделать также? |
| Автор: skyboy 5.12.2006, 16:41 | ||
не знаю... смотря где...
если вдруг не ошибся именем свойства с указателем на родителя(руки тянулись набить parentNode |
| Автор: 0leg 5.12.2006, 16:42 | ||
не угадал |
| Автор: skyboy 5.12.2006, 16:42 |
| Раз речь про ASP.NET, сорри заоффтоп |
| Автор: Дрон 5.12.2006, 16:45 |
Модератор: Если ты считаешь, что здесь кому-либо нравится угадывать твои мысли, то ты ошибаешься. Если это не ASP.NET, то сформулируй вопрос так, чтобы на него можно было нормально ответить. |
| Автор: ivashkanet 5.12.2006, 16:47 | ||
Ты прикалываться пришел?
Свойство Parent можно сделать internal для записи |
| Автор: mr.DUDA 5.12.2006, 22:56 | ||
0leg, ну если так уж надо, добавляйте в любой класс свойство Parent, а заполняйте его в конструкторе. Например:
|
| Автор: 0leg 5.12.2006, 23:10 |
Спасибо. Речь была именно об этом. Не знал, что аксессоры в C# 2005 можно делать с модификаторами доступа. Сейчас с трудом нашел об этом пару строчек у Троелсена. Как-то скудно этот вопрос освещен. В msdn наверняка всё описано, просто не знал в какой стороне искать. На всякий случай сформулирую вопрос четче: ---- Есть объект-родитель (можно назвать "объект-контейнер"), он содержит динамический список других объектов - дочерних. Дочерние объекты создаются родительским объектом, например методом Add. У каждого дочернего объекта есть свойство Parent, содержащее ссылку на объект-родитель. Типичный пример: класс TreeView содержит дочерние объекты класса TreeNode. Объекты TreeNode добавляются в TreeView методом TreeNode TreeView.Add(...). Созданные таким образом объекты имеют в свойстве Parent ссылку на объект-родитель. Но свойство Parent доступно только для чтения. Вопрос: каким образом TreeView устанавливает значение свойству TreeNode.Parent, если это свойство не доступно для записи ? |
| Автор: mr.DUDA 5.12.2006, 23:21 | ||
Очень интересная задача, на самом деле. И решается не так тривиально, как это может показаться на первый взгляд. Всё дело в "волшебных пузырьках", то есть - в специализированных коллекциях, в которых хранятся объекты-подчинённые объекта-владельца. Например, TreeNodeCollection хранит подчинённые TreeNode для TreeNode-родителя. Такая коллекция не имеет конструктора без параметров, т.к. не может существовать вне объекта-владельца; коллекцию создаёт объект-владелец и передаёт ей ссылку на себя. Далее всё просто. При добавлении объекта theNode в коллекцию, метод TreeNodeCollection.Add записывает в свойство theNode.Parent ссылку на TreeNode, которая хранится в TreeNodeCollection. Коллекция имеет на это право, т.к. объявлена в той же assembly, где и объект, а аксессор Parent.set сделан internal; или даже поле объявлено как internal, что делает его доступным для записи откуда угодно в той же сборке. При удалении theNode из коллекции, Parent соответственно сбрасывается в null. Остаётся лишь написать собственную реализацию класса и коллекции, "подхачивающую" Parent. Наверное, есть какой-то паттерн описывающий эту конструкцию, но лично я с ним незнаком З.Ы. 0leg, +1 за интересную задачку. |
| Автор: kobra 24.4.2007, 16:50 | ||||||||
клас сделать конечно не проблема, но чтобы интегрировать его так-же как TreeNodeCollection интегрирован в TreeNode, вот это ... может поможете? |