Здравствуйте, lleeoo, Вы писали:
L>Прошу поделитесь знаниями на тему: L>int2type для C#. L>type2type для C#. L>Пожалуйста не отрывками фраз ( а там сам догадаешься), а конкретным ПРИМЕРОМ (от простого к сложному) и описанием, или ссылку киньте.
Да. Не вопрос. Краткий ответ — метапрограммирования (МП) для C# нет, не было и (с огромной вероятностью) не будет никогда. А без этого данные шаблоны смысла не имеют. Более того дженерики не поддерживают констант в качестве параметров типов. Кроме того не поддерживается typedef. Так что int2type и type2type не получится воспроизвести даже ради смеха.
Если в работе требуется МП, то нужно искать, то нужно или пользоваться средствами МП времени выполнения или посткомпиляции, или использовать другие языки. Например, самое время познакомиться с Nemerle.
Кроме того логично было бы описать задачу для которой понадобились шаблоны int2type и type2type. Только сами задачи, а не видение их решения на С++.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
public class TreeItem
{
TreeItem _Parent;
protected List<TreeItem> _Children = new List<TreeItem>();
}
public class Prj : TreeItem
{
...
}
public class Obj : TreeItem
{
...
}
Создавая дерево Obj мне нужно хранить этиже объекты в дереве Prj, но тут появляется одна загвоздка — _Parent. Поменять _Parent я могу только в другом объекте (делать клон объекта это тупиковый путь, потом нужно искать одинаковые и т.д.). ЛИБО сделать класс котрый бы подсовывал _Parent для другого дерева.
ОБОБЩЕНИЕ ПРОБЛЕМЫ:
Если обобщить, то нужно сделать один объект для множеста деревьев. В результате сборщик мусора удолит объект тогда, когда объект удалится с каждого дерева (эта мысль была на этапе проектирования).
Здравствуйте, lleeoo, Вы писали:
L>Суть вопроса в следующем:
L>У меня есть два объекта одного класса L>
L>public class TreeItem
L>{
L> TreeItem _Parent;
L> protected List<TreeItem> _Children = new List<TreeItem>();
L>}
L>public class Prj : TreeItem
L>{
L>...
L>}
L>public class Obj : TreeItem
L>{
L>...
L>}
L>
L>Создавая дерево Obj мне нужно хранить этиже объекты в дереве Prj, но тут появляется одна загвоздка — _Parent. Поменять _Parent я могу только в другом объекте (делать клон объекта это тупиковый путь, потом нужно искать одинаковые и т.д.). ЛИБО сделать класс котрый бы подсовывал _Parent для другого дерева.
L>ОБОБЩЕНИЕ ПРОБЛЕМЫ: L>Если обобщить, то нужно сделать один объект для множеста деревьев. В результате сборщик мусора удолит объект тогда, когда объект удалится с каждого дерева (эта мысль была на этапе проектирования).
L>Надеюсь понятно описал.
Да очень, если честно Особенно не понятно как отображения в типы помогли бы Вам в решении этой задачи
Честно не понял как можно хранить "этиже" объекты в дереве с ветвями другого типа. Или Вам нужно чтобы разные инстансы класса Prj и Obj имели общую базовую часть?
Здравствуйте, cvetkov, Вы писали: C>не та мощность шаблонов в c#
Вернее не тот механизм
Здравствуйте, VladD2, Вы писали: VD>Если в работе требуется МП, то нужно искать, то нужно или пользоваться средствами МП времени выполнения или посткомпиляции, или использовать другие языки. Например, самое время познакомиться с Nemerle.
Не соглашусь с Вами, VladD2, знакомиться с Nemerle рановато будет
Тут сначала надо вообще с ООП познакомиться, потом узнать для чего вообще МП предназначено, а потом уже с чистой душой макросы курить
p.s. Прям ностальгия накрыла, списки типов вспомнил, стратегии... TypeTraits<T>, эдакий небольшой compile-time reflection... Александреску пылится на полке...
Бывало сидишь полчаса и вдупляешь какой шаблонов не может специализироваться по супер-информативному сообщению об ошибке...
Здравствуйте, Пельмешко, Вы писали:
П>Не соглашусь с Вами, VladD2, знакомиться с Nemerle рановато будет П>Тут сначала надо вообще с ООП познакомиться, потом узнать для чего вообще МП предназначено, а потом уже с чистой душой макросы курить
Я исходил из того, что человек уже знаком с ООП.
Вообще, прежде чем приступать к разработке современного софта желательно четко разбираться в ООП, СП (структурном программировании), ФП, и МП. Точнее надо знать как проектировать приложения с применением всех этих подходов.
Если этих знаний нет, то про такие вещи как type2type и заикаться не стоит.
П>p.s. Прям ностальгия накрыла, списки типов вспомнил, стратегии... TypeTraits<T>, эдакий небольшой compile-time reflection... Александреску пылится на полке... П>Бывало сидишь полчаса и вдупляешь какой шаблонов не может специализироваться по супер-информативному сообщению об ошибке...
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Отвечу по порядку:
1. С ООП знаком. С МП знаком слабовато (не считая знакомство с LISP, в течении 3 месяцев), УВЫ, причины не имеют значения.
2. Повторюсь: Цель, сделать так, что бы разные деревья ссылались на обин объект.
В надежде на то, что сборщик мусора удалит объект тогда, когда на него, никто не будет ссылаться (объект не входит не в одно дерево).
Пельмешко примерно понял: "Или Вам нужно чтобы разные инстансы класса Prj и Obj имели общую базовую часть?"
3. Один толковый парень подсказал попробовать type2type (если не поможет то знания не помешают) потому и задал соответсвующий вопрос, сори за некомпетентность.
4. Спасибо за то, что сразу сказали о тупиковом пути: "время-деньги".
Спасибо за быструю реакцию на вопрос, удивлен, в сравнении с другими форумами.
5. К сожалению тема вопроса не будет соответсвать содержанию.
Здравствуйте, lleeoo, Вы писали:
L>2. Повторюсь: L>Цель, сделать так, что бы разные деревья ссылались на обин объект. L>В надежде на то, что сборщик мусора удалит объект тогда, когда на него, никто не будет ссылаться (объект не входит не в одно дерево).
Мне казалось, что я уже послал ответ в соседней подветке. Но похоже забыл нажать кнопку "Послать".
Повторяю ответ.
Самый идеологически правильный подход в данном случае — удалить поле Parent из объекта описывающего дерево.
Далее все зависит от лагоритмов.
Если деревья нужно обрабатывать пакетно (не интерактивно), то поле Parent просто не нужно. Родителя можно просто хранить в стеке (передавать через параметры функции производящих обработку).
Если требуется интерактивная обработка (например, пользователь тыкает в ветку и что-то с ней делает), то можно создать ассоциативный массив (хэш-таблицу) в каждом из деревьев в которой хранить обратные ссылки. Причем ссылки надо хранить в виде объектов WeakReference. Тогда GC не будет брать их в расчет и признает при построении графа живых объектов. В прочем, можно хранить и прямые ссылки, но обязательно удалять их при удалении ветки из дерева.
L>Пельмешко примерно понял: "Или Вам нужно чтобы разные инстансы класса Prj и Obj имели общую базовую часть?"
L>3. Один толковый парень подсказал попробовать type2type (если не поможет то знания не помешают) потому и задал соответсвующий вопрос, сори за некомпетентность.
Не видя полного решения тяжело говор о его приемлемости, но мне кажется, что type2type тут ничем не поможет. Тебе ведь нужны физические множественные обратные ссылки. А type2type позволят только лишь создать искусственный тип.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, lleeoo, Вы писали:
L>Пельмешко примерно понял: "Или Вам нужно чтобы разные инстансы класса Prj и Obj имели общую базовую часть?"
А что такого в общей части, что её надо хранить в единственном экземпляре для двух деревьев?
public class TreeItem
{
TreeItem _Parent;
protected List<TreeItem> _Children = new List<TreeItem>();
}
Я тут вижу только специфичную для каждого дерева информацию, как Вы говорили _Parent'ы у них могут отличаться, соответственно _Children тоже.
Если есть ещё общие члены, то можно поместить их в отдельный класс и хранить сколько угодно ссылок на него в скольких угодно TreeItem'ах...
Задумку я не понимаю, что движет к "обощению", большие объёмы данных...?
Здравствуйте, lleeoo, Вы писали:
L>2. Повторюсь: L>Цель, сделать так, что бы разные деревья ссылались на обин объект. L>В надежде на то, что сборщик мусора удалит объект тогда, когда на него, никто не будет ссылаться (объект не входит не в одно дерево).
L>Пельмешко примерно понял: "Или Вам нужно чтобы разные инстансы класса Prj и Obj имели общую базовую часть?"
Может использовать ObjectFactory, которая возвращает всегда только один экземпляр для каждого варианта критериев?
В общем не понятно, что имеено вам нужно, а потому тружно предложить какое-либо решение...
Сори, за молчание, только включили свет, ща напишу подробнее, к чему я пришел и что хотел.
Re: Help. Шаблон type2type для C#.
От:
Аноним
Дата:
18.03.09 13:39
Оценка:
Кто-то задал вопрос, зачем мне нужно Айтемы одного дерева в другом.
Смысл задачи в том, что данные приходят от разных объектов (ОБЪЕКТЫ имеют древовидную структуру), нужно обобщать (не делать копии) эти данные в одно хранилище (ПРОЕКТ), для того, что бы использовать данные одного ОБЪЕКТА в другом через это общее ХРАНИЛИЩЕ. Вот и получается хранение указателя в разных деревьях.
Вариант свяки по имени не рассматриваю — он очевиден. Хочется сделать что-то интересное.
Конечно основеной ошибкой было желание использовать Айтемы одного дерева в другом. Вчера вечером по дороге домой решил (совпали у нас мысли с кем-то), нужно сделать объекты без Парентов и засовывать их указатели в Айтемы дерева.
Все свелось к простому решению, жаль нет ничего в этом интересного. Хотя из данной переписки увидел еще одну ограниченность C#:
1. Шаблон патерна Синглтона сделать нельзя.
2. Множественного наследования нет.
3. Нельзя сделать type2type (слаб я в МП), но интереса к этому все больше и больше.
Сделали бы вы такое — Это невозможно на C#.
Спасибо за быструю реакцию на заданные вопрсы.
И последнее.
Скиньте пожалуйста ссылки на темы с примерами (от простого к сложному) Мета Программирования (С++ и C# ).
Здравствуйте, Аноним, Вы писали:
А>Смысл задачи в том, что данные приходят от разных объектов (ОБЪЕКТЫ имеют древовидную структуру), нужно обобщать (не делать копии) эти данные в одно хранилище (ПРОЕКТ), для того, что бы использовать данные одного ОБЪЕКТА в другом через это общее ХРАНИЛИЩЕ. Вот и получается хранение указателя в разных деревьях.
Всеравно не ясно что тебе надо.
Попробуй описать задачу, а не решение.
А>1. Шаблон патерна Синглтона сделать нельзя.
Антипаттерн синглетон использовать нельзя вообще никогда.
По хорошему статические переменные нужно вообще из системы типов удалить.
А>2. Множественного наследования нет.
Я склоняюсь к мнению что и одиночное не нужно.
Интерфейсы + миксины само то.
Либо по рабоче крестьянски http://nemerle.org/Design_patterns см макры Aggregate и Proxy.
А>Скиньте пожалуйста ссылки на темы с примерами (от простого к сложному) Мета Программирования (С++ и C# ).
По C# нету. Ибо не позволяет.
С МП на С++ лучше не связывайся. Ибо очень сильно тормозит компиляцию и сообщения об ошибках такие что закачаешься. Это я тебе как краеевед
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[3]: Help. Шаблон type2type для C#.
От:
Аноним
Дата:
18.03.09 15:24
Оценка:
WolfHound-у от lleeoo:
1. WH>Всеравно не ясно что тебе надо.
Ок ща приведу упрощенный варианткода так будет понятнее.
2. WH>По хорошему статические переменные нужно вообще из системы типов удалить.
Вопрос спорный судить не буду.
WH>Интерфейсы + миксины само то. WH>Либо по рабоче крестьянски http://nemerle.org/Design_patterns см макры Aggregate и Proxy.
Спасибо за рекомендации, взял на заметку.
WH>С МП на С++ лучше не связывайся. Ибо очень сильно тормозит компиляцию и сообщения об ошибках такие что закачаешься. Это я тебе как краеевед
/* Базовый класс реализующий дерево */
public class TreeItem : I...
{
TreeItem _Parent;
protected List<TreeItem> _Children = new List<TreeItem>();
...
}
//____________________________________________________________
/* конечный элемент дерева. Указатели на объекты SignalBase нужно хранить в двух деревьях */
public class SignalBase : TreeItem, I...
{
string _Base;
...
}
public class WrapperSignalBase : TreeItem
{
...
public override void NewTreeItem() { _Children.Add(new SignalBase()); }
}
//____________________________________________________________
/* конечный элемент дерева. Указатели на объекты SignalUser нужно хранить в двух деревьях */
public class SignalUser : TreeItem, I...
{
string _User;
...
}
public class WrapperSignalUser : TreeItem
{
...
public override void NewTreeItem() { _Children.Add(new SignalUser()); }
}
//____________________________________________________________
/* Дерево сигналов которое используется как для индивидуального так и для обобщенного хранения данных */
public class TreeSignals : TreeItem
{
WrapperSignalBase _HoldSignalBase;
WrapperSignalUser _HoldSignalUser;
...
}
//____________________________________________________________
public class TestObject : TreeItem, I...
{
TreeSignals _TOSignals;
...
}
/* Как мы видим TestObject-ов может быть много у одного проекта и каждый ТО хранит в себе дерево Сигналов.
Но проект должен собрать все сигналы от каждого ТО в одно общее дерево.
Но не имеет смысла создавать новые объекты SignalBase и SignalUser для передачи в дерево проекта.
Я хотел бы хранить только указатели на них.
Так вот когда я начал скидывать указатели Сигналов в дерево проекта, началась путаница с Парентом, он то указывает на ветку ТО.
*/
public class Project : TreeItem, I...
{
TreeSignals _ProjectSignals;
...
public override void NewTreeItem() { _Children.Add(new TestObject()); }
}
Решение напрашивается очевидное не наследовать SignalBase и SignalUser от TreeItem а просто, создавать их объекты и в список детей добавлять их как конечный элемент.
В общемто получилось все достаточно тривиално.
Но хотел, каким-то образом подсовывать несколько Парентов одному Сигналу (SignalBase и SignalUser).