Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как родителю менять св-во Parent дочернего класса 
:(
    Опции темы
0leg
Дата 5.12.2006, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 23.11.2006

Репутация: 1
Всего: 1



У многих классов NET есть свойство Parent, доступное только для чтения. Как родительские классы записывают в него значение?
Хочу сделать также!
Ни конструкторов ни методов для установки Parent я не нашел. smile
PM MAIL   Вверх
ivashkanet
Дата 5.12.2006, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



0leg, какие именно классы тебя интересуют smile 
PM MAIL WWW ICQ   Вверх
Дрон
Дата 5.12.2006, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 24
Всего: 93



Цитата(0leg @  5.12.2006,  16:23 Найти цитируемый пост)
У многих классов NET есть свойство Parent, доступное только для чтения. Как родительские классы записывают в него значение?
Хочу сделать также!
Ни конструкторов ни методов для установки Parent я не нашел. smile 

По косвенным признакам догадываюсь, что речь идёт об ASP.NET ? Я прав?

Свойство Parent -- это всего лишь следствие, а делать надо так

Пусть
ctrlParent -- "родитель" в иерархии контролов 
ctrlChild -- "потомок" в иерархии контролов
тогда просто делаем ctrlParent.Controls.Add(ctrlChild);  и всё smile


Это сообщение отредактировал(а) Дрон - 5.12.2006, 16:39


--------------------
Да. Именно так.
PM   Вверх
0leg
Дата 5.12.2006, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 23.11.2006

Репутация: 1
Всего: 1



Цитата(ivashkanet @  5.12.2006,  16:29 Найти цитируемый пост)
0leg, какие именно классы тебя интересуют

Из существующих - TreeNode.Parent например.

Меня интересует, могу ли я в своих классах сделать также?
PM MAIL   Вверх
skyboy
Дата 5.12.2006, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: нет
Всего: 260



не знаю... смотря где...
Код

System::Windows::Forms::ListView *l= new System::Windows::Forms::ListView();
l->parent= Form1;

если вдруг не ошибся именем свойства с указателем на родителя(руки тянулись набить parentNode  smile ), именно так я привязываю динамически созданный ListView, чтоб он отображался на форме... И работает
PM MAIL   Вверх
0leg
Дата 5.12.2006, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 23.11.2006

Репутация: 1
Всего: 1



Цитата(Дрон @  5.12.2006,  16:36 Найти цитируемый пост)
По косвенным признакам догадываюсь, что речь идёт об ASP.NET ? Я прав?

не угадал  smile 
PM MAIL   Вверх
skyboy
Дата 5.12.2006, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: нет
Всего: 260



Раз речь про ASP.NET, сорри заоффтоп smile
PM MAIL   Вверх
Дрон
Дата 5.12.2006, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 24
Всего: 93



Цитата(0leg @  5.12.2006,  16:42 Найти цитируемый пост)
не угадал  smile  

Модератор: Если ты считаешь, что здесь кому-либо нравится угадывать твои мысли, то ты ошибаешься.
Если это не ASP.NET, то сформулируй вопрос так, чтобы на него можно было нормально ответить.


Это сообщение отредактировал(а) Дрон - 5.12.2006, 16:46


--------------------
Да. Именно так.
PM   Вверх
ivashkanet
Дата 5.12.2006, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Цитата(0leg @  5.12.2006,  15:42 Найти цитируемый пост)
не угадал  smile  

Ты прикалываться пришел?

Код

AddCihld(Child child)
{
this.AddToCollection(chld);

child.Paren = this;
}


Свойство Parent можно сделать internal для записи

PM MAIL WWW ICQ   Вверх
mr.DUDA
Дата 5.12.2006, 22:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



0leg, ну если так уж надо, добавляйте в любой класс свойство Parent, а заполняйте его в конструкторе. Например:

Код
using System;

/// <summary>
/// Базовый класс для объектов с иерархией.
/// </summary>
public class HierarchyObject
{
    public HierarchyObject(HierarchyObject parent)
    {
        _parent = parent;
    }

    private HierarchyObject _parent;
    public HierarchyObject Parent
    {
        get
        {
            return _parent;
        }
    }
}

/// <summary>
/// Пример класса, поддерживающего иерархию, и добавляющего
/// собственное поле и метод, который эту иерархию использует.
/// </summary>
public class Example1 : HierarchyObject
{
    public Example1(Example1 parent)
        : base(parent)
    {
    }

    int НекоеПоле = 123;

    public int ПолучитьПолеРодителяПлюсX(int x)
    {
        return ((Example1)this.Parent).НекоеПоле + x;
    }
}



--------------------
user posted image
PM MAIL WWW   Вверх
0leg
Дата 5.12.2006, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 23.11.2006

Репутация: 1
Всего: 1



Цитата(ivashkanet @  5.12.2006,  16:47 Найти цитируемый пост)
Свойство Parent можно сделать internal для записи

Спасибо. Речь была именно об этом. Не знал, что аксессоры в C# 2005 можно делать с модификаторами доступа. Сейчас с трудом нашел об этом пару строчек у Троелсена. Как-то скудно этот вопрос освещен. В msdn наверняка всё описано, просто не знал в какой стороне искать.

На всякий случай сформулирую вопрос четче:
----

Есть объект-родитель (можно назвать "объект-контейнер"), он содержит динамический список других объектов - дочерних. Дочерние объекты создаются родительским объектом, например методом Add. У каждого дочернего объекта есть свойство Parent, содержащее ссылку на объект-родитель. 

Типичный пример: класс TreeView содержит дочерние объекты класса TreeNode. Объекты TreeNode добавляются в TreeView методом TreeNode TreeView.Add(...). Созданные таким образом объекты имеют в свойстве Parent ссылку на объект-родитель. Но свойство Parent доступно только для чтения.

Вопрос: каким образом TreeView устанавливает значение свойству TreeNode.Parent, если это свойство не доступно для записи ?



PM MAIL   Вверх
mr.DUDA
Дата 5.12.2006, 23:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Цитата(0leg @  5.12.2006,  22:10 Найти цитируемый пост)
Вопрос: каким образом TreeView устанавливает значение свойству TreeNode.Parent, если это свойство не доступно для записи ?

Очень интересная задача, на самом деле. И решается не так тривиально, как это может показаться на первый взгляд. Всё дело в "волшебных пузырьках", то есть - в специализированных коллекциях, в которых хранятся объекты-подчинённые объекта-владельца. Например, TreeNodeCollection хранит подчинённые TreeNode для TreeNode-родителя. Такая коллекция не имеет конструктора без параметров, т.к. не может существовать вне объекта-владельца; коллекцию создаёт объект-владелец и передаёт ей ссылку на себя. 

Далее всё просто. При добавлении объекта theNode в коллекцию, метод TreeNodeCollection.Add записывает в свойство theNode.Parent ссылку на TreeNode, которая хранится в TreeNodeCollection. Коллекция имеет на это право, т.к. объявлена в той же assembly, где и объект, а аксессор Parent.set сделан internal; или даже поле объявлено как internal, что делает его доступным для записи откуда угодно в той же сборке. При удалении theNode из коллекции, Parent соответственно сбрасывается в null. Остаётся лишь написать собственную реализацию класса и коллекции, "подхачивающую" Parent.

Наверное, есть какой-то паттерн описывающий эту конструкцию, но лично я с ним незнаком  smile. Не так давно пришлось такую же задачу решать при создании собственного аналога TreeView.

З.Ы. 0leg, +1 за интересную задачку. 


--------------------
user posted image
PM MAIL WWW   Вверх
kobra
Дата 24.4.2007, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 730
Регистрация: 15.6.2005
Где: Грузия, Тбилиси

Репутация: 1
Всего: 9



Цитата(mr.DUDA @  5.12.2006,  23:21 Найти цитируемый пост)
 Не так давно пришлось такую же задачу решать при создании собственного аналога TreeView.
вот тепер я начал делать 
Код
public partial class DBTreeView : TreeView
естестетвенно сделал 
Код
public class DBTreeNode : TreeNode
дашло дело до 
Код
public class DBTreeNodeCollection
и застрял. 
клас сделать конечно не проблема, но чтобы интегрировать его так-же как TreeNodeCollection интегрирован в TreeNode, вот это ...
может поможете?


Это сообщение отредактировал(а) kobra - 24.4.2007, 17:18
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.1688 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.