Help. Шаблон type2type для C#.
От: lleeoo  
Дата: 17.03.09 15:22
Оценка:
Прошу поделитесь знаниями на тему:

int2type для C#.
type2type для C#.

Пожалуйста не отрывками фраз ( а там сам догадаешься), а конкретным ПРИМЕРОМ (от простого к сложному) и описанием, или ссылку киньте.

Сам порылся в нете не находил.

Для С++ (Александреску) полно, но не нужно.
Re: Help. Шаблон type2type для C#.
От: cvetkov  
Дата: 17.03.09 15:34
Оценка: 1 (1)
а можно в двух словах описть что нужно без отсылки к существующим реализациям?

если упомянут александреску, то скорее всего это зделать нельзя не та мощность шаблонов в c#
Re: Help. Шаблон type2type для C#.
От: VladD2 Российская Империя www.nemerle.org
Дата: 17.03.09 15:45
Оценка:
Здравствуйте, lleeoo, Вы писали:

L>Прошу поделитесь знаниями на тему:

L>int2type для C#.
L>type2type для C#.
L>Пожалуйста не отрывками фраз ( а там сам догадаешься), а конкретным ПРИМЕРОМ (от простого к сложному) и описанием, или ссылку киньте.

Да. Не вопрос. Краткий ответ — метапрограммирования (МП) для C# нет, не было и (с огромной вероятностью) не будет никогда. А без этого данные шаблоны смысла не имеют. Более того дженерики не поддерживают констант в качестве параметров типов. Кроме того не поддерживается typedef. Так что int2type и type2type не получится воспроизвести даже ради смеха.
Если в работе требуется МП, то нужно искать, то нужно или пользоваться средствами МП времени выполнения или посткомпиляции, или использовать другие языки. Например, самое время познакомиться с Nemerle.

Кроме того логично было бы описать задачу для которой понадобились шаблоны int2type и type2type. Только сами задачи, а не видение их решения на С++.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Help. Шаблон type2type для C#.
От: lleeoo  
Дата: 17.03.09 16:01
Оценка:
Суть вопроса в следующем:

У меня есть два объекта одного класса
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 для другого дерева.

ОБОБЩЕНИЕ ПРОБЛЕМЫ:
Если обобщить, то нужно сделать один объект для множеста деревьев. В результате сборщик мусора удолит объект тогда, когда объект удалится с каждого дерева (эта мысль была на этапе проектирования).



Надеюсь понятно описал.
Re[3]: Help. Шаблон type2type для C#.
От: Пельмешко Россия blog
Дата: 17.03.09 16:14
Оценка:
Здравствуйте, 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 имели общую базовую часть?
Re[2]: Help. Шаблон type2type для C#.
От: Пельмешко Россия blog
Дата: 17.03.09 16:38
Оценка:
Здравствуйте, cvetkov, Вы писали:
C>не та мощность шаблонов в c#

Вернее не тот механизм

Здравствуйте, VladD2, Вы писали:
VD>Если в работе требуется МП, то нужно искать, то нужно или пользоваться средствами МП времени выполнения или посткомпиляции, или использовать другие языки. Например, самое время познакомиться с Nemerle.

Не соглашусь с Вами, VladD2, знакомиться с Nemerle рановато будет
Тут сначала надо вообще с ООП познакомиться, потом узнать для чего вообще МП предназначено, а потом уже с чистой душой макросы курить

p.s. Прям ностальгия накрыла, списки типов вспомнил, стратегии... TypeTraits<T>, эдакий небольшой compile-time reflection... Александреску пылится на полке...
Бывало сидишь полчаса и вдупляешь какой шаблонов не может специализироваться по супер-информативному сообщению об ошибке...
Re[3]: Help. Шаблон type2type для C#.
От: VladD2 Российская Империя www.nemerle.org
Дата: 17.03.09 16:45
Оценка:
Здравствуйте, Пельмешко, Вы писали:

П>Не соглашусь с Вами, VladD2, знакомиться с Nemerle рановато будет

П>Тут сначала надо вообще с ООП познакомиться, потом узнать для чего вообще МП предназначено, а потом уже с чистой душой макросы курить

Я исходил из того, что человек уже знаком с ООП.

Вообще, прежде чем приступать к разработке современного софта желательно четко разбираться в ООП, СП (структурном программировании), ФП, и МП. Точнее надо знать как проектировать приложения с применением всех этих подходов.

Если этих знаний нет, то про такие вещи как type2type и заикаться не стоит.

П>p.s. Прям ностальгия накрыла, списки типов вспомнил, стратегии... TypeTraits<T>, эдакий небольшой compile-time reflection... Александреску пылится на полке...

П>Бывало сидишь полчаса и вдупляешь какой шаблонов не может специализироваться по супер-информативному сообщению об ошибке...

Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Help. Шаблон type2type для C#.
От: lleeoo  
Дата: 17.03.09 18:19
Оценка:
Отвечу по порядку:
1. С ООП знаком. С МП знаком слабовато (не считая знакомство с LISP, в течении 3 месяцев), УВЫ, причины не имеют значения.

2. Повторюсь:
Цель, сделать так, что бы разные деревья ссылались на обин объект.
В надежде на то, что сборщик мусора удалит объект тогда, когда на него, никто не будет ссылаться (объект не входит не в одно дерево).


Пельмешко примерно понял: "Или Вам нужно чтобы разные инстансы класса Prj и Obj имели общую базовую часть?"

3. Один толковый парень подсказал попробовать type2type (если не поможет то знания не помешают) потому и задал соответсвующий вопрос, сори за некомпетентность.

4. Спасибо за то, что сразу сказали о тупиковом пути: "время-деньги".
Спасибо за быструю реакцию на вопрос, удивлен, в сравнении с другими форумами.

5. К сожалению тема вопроса не будет соответсвать содержанию.
Re[2]: Help. Шаблон type2type для C#.
От: VladD2 Российская Империя www.nemerle.org
Дата: 17.03.09 18:54
Оценка:
Здравствуйте, lleeoo, Вы писали:

L>2. Повторюсь:

L>Цель, сделать так, что бы разные деревья ссылались на обин объект.
L>В надежде на то, что сборщик мусора удалит объект тогда, когда на него, никто не будет ссылаться (объект не входит не в одно дерево).


Мне казалось, что я уже послал ответ в соседней подветке. Но похоже забыл нажать кнопку "Послать".
Повторяю ответ.

Самый идеологически правильный подход в данном случае — удалить поле Parent из объекта описывающего дерево.
Далее все зависит от лагоритмов.
Если деревья нужно обрабатывать пакетно (не интерактивно), то поле Parent просто не нужно. Родителя можно просто хранить в стеке (передавать через параметры функции производящих обработку).
Если требуется интерактивная обработка (например, пользователь тыкает в ветку и что-то с ней делает), то можно создать ассоциативный массив (хэш-таблицу) в каждом из деревьев в которой хранить обратные ссылки. Причем ссылки надо хранить в виде объектов WeakReference. Тогда GC не будет брать их в расчет и признает при построении графа живых объектов. В прочем, можно хранить и прямые ссылки, но обязательно удалять их при удалении ветки из дерева.

L>Пельмешко примерно понял: "Или Вам нужно чтобы разные инстансы класса Prj и Obj имели общую базовую часть?"


L>3. Один толковый парень подсказал попробовать type2type (если не поможет то знания не помешают) потому и задал соответсвующий вопрос, сори за некомпетентность.


Не видя полного решения тяжело говор о его приемлемости, но мне кажется, что type2type тут ничем не поможет. Тебе ведь нужны физические множественные обратные ссылки. А type2type позволят только лишь создать искусственный тип.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Help. Шаблон type2type для C#.
От: Пельмешко Россия blog
Дата: 17.03.09 19:00
Оценка:
Здравствуйте, lleeoo, Вы писали:

L>Пельмешко примерно понял: "Или Вам нужно чтобы разные инстансы класса Prj и Obj имели общую базовую часть?"


А что такого в общей части, что её надо хранить в единственном экземпляре для двух деревьев?
public class TreeItem
{
    TreeItem _Parent;
    protected List<TreeItem> _Children = new List<TreeItem>();
}

Я тут вижу только специфичную для каждого дерева информацию, как Вы говорили _Parent'ы у них могут отличаться, соответственно _Children тоже.
Если есть ещё общие члены, то можно поместить их в отдельный класс и хранить сколько угодно ссылок на него в скольких угодно TreeItem'ах...
Задумку я не понимаю, что движет к "обощению", большие объёмы данных...?
Re[2]: Help. Шаблон type2type для C#.
От: koandrew Канада http://thingselectronic.blogspot.ca/
Дата: 17.03.09 22:42
Оценка:
Здравствуйте, lleeoo, Вы писали:

L>2. Повторюсь:

L>Цель, сделать так, что бы разные деревья ссылались на обин объект.
L>В надежде на то, что сборщик мусора удалит объект тогда, когда на него, никто не будет ссылаться (объект не входит не в одно дерево).


L>Пельмешко примерно понял: "Или Вам нужно чтобы разные инстансы класса Prj и Obj имели общую базовую часть?"


Может использовать ObjectFactory, которая возвращает всегда только один экземпляр для каждого варианта критериев?

В общем не понятно, что имеено вам нужно, а потому тружно предложить какое-либо решение...
[КУ] оккупировала армия.
Re: Help. Шаблон type2type для C#.
От: Аноним  
Дата: 18.03.09 13:10
Оценка:
Сори, за молчание, только включили свет, ща напишу подробнее, к чему я пришел и что хотел.
Re: Help. Шаблон type2type для C#.
От: Аноним  
Дата: 18.03.09 13:39
Оценка: :)
Кто-то задал вопрос, зачем мне нужно Айтемы одного дерева в другом.

Смысл задачи в том, что данные приходят от разных объектов (ОБЪЕКТЫ имеют древовидную структуру), нужно обобщать (не делать копии) эти данные в одно хранилище (ПРОЕКТ), для того, что бы использовать данные одного ОБЪЕКТА в другом через это общее ХРАНИЛИЩЕ. Вот и получается хранение указателя в разных деревьях.

Вариант свяки по имени не рассматриваю — он очевиден. Хочется сделать что-то интересное.

Конечно основеной ошибкой было желание использовать Айтемы одного дерева в другом.
Вчера вечером по дороге домой решил (совпали у нас мысли с кем-то), нужно сделать объекты без Парентов и засовывать их указатели в Айтемы дерева.

Все свелось к простому решению, жаль нет ничего в этом интересного. Хотя из данной переписки увидел еще одну ограниченность C#:
1. Шаблон патерна Синглтона сделать нельзя.
2. Множественного наследования нет.
3. Нельзя сделать type2type (слаб я в МП), но интереса к этому все больше и больше.

Сделали бы вы такое — Это невозможно на C#.

Спасибо за быструю реакцию на заданные вопрсы.

И последнее.
Скиньте пожалуйста ссылки на темы с примерами (от простого к сложному) Мета Программирования (С++ и C# ).
Re[2]: Help. Шаблон type2type для C#.
От: WolfHound  
Дата: 18.03.09 14:39
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>Смысл задачи в том, что данные приходят от разных объектов (ОБЪЕКТЫ имеют древовидную структуру), нужно обобщать (не делать копии) эти данные в одно хранилище (ПРОЕКТ), для того, что бы использовать данные одного ОБЪЕКТА в другом через это общее ХРАНИЛИЩЕ. Вот и получается хранение указателя в разных деревьях.

Всеравно не ясно что тебе надо.
Попробуй описать задачу, а не решение.

А>1. Шаблон патерна Синглтона сделать нельзя.

Антипаттерн синглетон использовать нельзя вообще никогда.
По хорошему статические переменные нужно вообще из системы типов удалить.

А>2. Множественного наследования нет.

Я склоняюсь к мнению что и одиночное не нужно.
Интерфейсы + миксины само то.
Либо по рабоче крестьянски http://nemerle.org/Design_patterns см макры Aggregate и Proxy.

А>Скиньте пожалуйста ссылки на темы с примерами (от простого к сложному) Мета Программирования (С++ и C# ).

По C# нету. Ибо не позволяет.
С МП на С++ лучше не связывайся. Ибо очень сильно тормозит компиляцию и сообщения об ошибках такие что закачаешься. Это я тебе как краеевед
Автор: WolfHound
Дата: 22.05.06
говорю.
Если тебе надо МП под .НЕТ то смотри тут http://rsdn.ru/summary/3766.xml
Пусть это будет просто:
просто, как только можно,
но не проще.
(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>С МП на С++ лучше не связывайся. Ибо очень сильно тормозит компиляцию и сообщения об ошибках такие что закачаешься. Это я тебе как краеевед
Автор: WolfHound
Дата: 22.05.06
говорю.

WH>Если тебе надо МП под .НЕТ то смотри тут http://rsdn.ru/summary/3766.xml

Спасибо за рекомендации, взял на заметку.
Re: Help. Шаблон type2type для C#.
От: lleeoo  
Дата: 18.03.09 15:49
Оценка:
Упрощенный вид кода:
Названия абстрактные.


    /*  Базовый класс реализующий дерево  */
    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).

Думаю теперь понятно, написал.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.