как можно попроще реализовать статические виртуальные методы для класса (не городя фабрик и т.п.) на С# ?
поделитесь плз. у кого какие идеи по этому поводу ?
вообще как это должно выглядеть по-нормальному ?
04.03.04 20:06: Перенесено модератором из '.NET' — TK
Здравствуйте, s.ts, Вы писали:
ST>как можно попроще реализовать статические виртуальные методы для класса (не городя фабрик и т.п.) на С# ? ST>поделитесь плз. у кого какие идеи по этому поводу ?
ST>вообще как это должно выглядеть по-нормальному ?
Они уже реализованы в Delphi через метаклассы. http://www.rsdn.ru/Forum/Message.aspx?mid=548308&only=1
Здравствуйте, Igor Trofimov, Вы писали:
ST>>>вообще как это должно выглядеть по-нормальному ? S>> Они уже реализованы в Delphi через метаклассы. S>> Но это фича языка.
iT>Кстати, уже несколько раз с огорчением обнаруживал, что этой замечательной вещи мне после Delphi в шарпе не хватает ;(
Теперь есть. Завтра до работы попробую разобраться с Implements
и солнце б утром не вставало, когда бы не было меня
iT>>Кстати, уже несколько раз с огорчением обнаруживал, что этой замечательной вещи мне после Delphi в шарпе не хватает ;( S> Теперь есть. Завтра до работы попробую разобраться с Implements
Здравствуйте, s.ts, Вы писали:
ST>как можно попроще реализовать статические виртуальные методы для класса (не городя фабрик и т.п.) на С# ? ST>поделитесь плз. у кого какие идеи по этому поводу ?
ST>вообще как это должно выглядеть по-нормальному ?
Зачем?
... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Serginio1, Вы писали:
S>Здравствуйте, s.ts, Вы писали:
ST>>как можно попроще реализовать статические виртуальные методы для класса (не городя фабрик и т.п.) на С# ? ST>>поделитесь плз. у кого какие идеи по этому поводу ?
ST>>вообще как это должно выглядеть по-нормальному ? S> Они уже реализованы в Delphi через метаклассы. S>http://www.rsdn.ru/Forum/Message.aspx?mid=548308&only=1
Здравствуйте, Serginio1, Вы писали:
S>Здравствуйте, Igor Trofimov, Вы писали:
ST>>>>вообще как это должно выглядеть по-нормальному ? S>>> Они уже реализованы в Delphi через метаклассы. S>>> Но это фича языка.
iT>>Кстати, уже несколько раз с огорчением обнаруживал, что этой замечательной вещи мне после Delphi в шарпе не хватает ;( S> Теперь есть. Завтра до работы попробую разобраться с Implements
ST>виртуальные статические методы видимо не имеют смысла без метаклассов (тпа фабрик, что ли)
Ну, есть же RuntimeType, вот могли бы при инициализации типа делать singleton-потомок от него, описывающий конкретный тип. Эта штука и возвращалась бы по GetType(). Умела бы создавать экземпляры. Обеспечивала бы поддержку виртуальных (для экземпляра, соответственно — статических виртуальных) методов.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, s.ts, Вы писали:
ST>>как можно попроще реализовать статические виртуальные методы для класса (не городя фабрик и т.п.) на С# ? ST>>поделитесь плз. у кого какие идеи по этому поводу ?
ST>>вообще как это должно выглядеть по-нормальному ?
VD>Зачем?
чтобы флейм не разводить на тему Delphi.net vs C#
меня интересует конкретные возможности языков
разумнее, конечно, использовать C#, но хотелось бы знать во что мне выльется отсутствие некоей функциональности (автогенерация фабрик классов) в С#
а может быть это появится через пол-года и там ?
Здравствуйте, Igor Trofimov, Вы писали:
ST>>виртуальные статические методы видимо не имеют смысла без метаклассов (тпа фабрик, что ли)
iT>Ну, есть же RuntimeType, вот могли бы при инициализации типа делать singleton-потомок от него, описывающий конкретный тип. Эта штука и возвращалась бы по GetType(). Умела бы создавать экземпляры. Обеспечивала бы поддержку виртуальных (для экземпляра, соответственно — статических виртуальных) методов.
не понял.
это руководство к действию для меня или для MS ?
iT>Зря не сделали такое в CLR.
Здравствуйте, s.ts, Вы писали:
ST>Здравствуйте, Igor Trofimov, Вы писали:
ST>>>а не собираются ?
iT>>Вроде нет ;(
ST>>>а чего сейчас-то делать ?
iT>>Выкручиваться как-то.
ST>дык какой путь имеет минимальные издержки на кодирование ?
ST>никто не сталкивался ?
ST>можно шаблоны использовать (те, что будут)
кстати, там чего-нибудь типа макросов не предвидится ?
то можно было бы изврат c rtii по типу mfc устроить ?
Здравствуйте, Igor Trofimov, Вы писали:
iT>>>Кстати, уже несколько раз с огорчением обнаруживал, что этой замечательной вещи мне после Delphi в шарпе не хватает ;( S>> Теперь есть. Завтра до работы попробую разобраться с Implements
iT>Ась? В шарпе? хде?
А что нельзя Дельфевые объекты в Шарпе использовать?????
Пиши классы на Delphi используй в шарпе.
и солнце б утром не вставало, когда бы не было меня
ST>виртуальные статические методы видимо не имеют смысла без метаклассов (тпа фабрик, что ли)
Не совсем так. В нативном Delphi как таковых метаклассов нет. Есть VMT которая располагается в две строны с положительным смещением виртуальные методы для экземпляров типа, с отрицательным для инфрмации о типе и виртуальных методов типа (виртуальных статических) ST>вот и вопрос как это реализовать попроще
ST>и какие у этого перспективы
А чем тебе Дельфевая реализация не нравится????
Перпективы в ненужности использования рефлексии и простота использования наследников типов.
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, s.ts, Вы писали:
S>> Теперь есть. Завтра до работы попробую разобраться с Implements
ST>что есть "Implements" ? ST>где смотреть ?
Директива Implements в Delphi говорить, что за реализацию интерфейса(ов) объекта, отвечает объект являющийся полем этого класса. То есть тебе не надо реализовывать все методы интерфеса в классе.
Но чего то у меня не получилось. Хотя директива осталась.
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Igor Trofimov, Вы писали:
ST>>кстати, там чего-нибудь типа макросов не предвидится ? ST>>то можно было бы изврат c rtii по типу mfc устроить ?
iT>Извратов — лучше не надо. iT>Лучше без метаклассов — но не портить язык.
тогда придется ждать пока MS услышит глас вопиющего в пустыне
имхо нужно не за чистоту языка бороться, а как-то решать возникающиек проблемы
а придурки, как их не ограничивай в возможностях, все равно напишут что-нибудь грустное для окружающих
Здравствуйте, Serginio1, Вы писали:
S>Здравствуйте, s.ts, Вы писали:
ST>>виртуальные статические методы видимо не имеют смысла без метаклассов (тпа фабрик, что ли)
S> Не совсем так. В нативном Delphi как таковых метаклассов нет. Есть VMT которая располагается в две строны с положительным смещением виртуальные методы для экземпляров типа, с отрицательным для инфрмации о типе и виртуальных методов типа (виртуальных статических) ST>>вот и вопрос как это реализовать попроще
могу добавить, типа чтобы все это еще умнее выглядело:
ST>>и какие у этого перспективы S> А чем тебе Дельфевая реализация не нравится???? S> Перпективы в ненужности использования рефлексии и простота использования наследников типов.
нужна реализация для мэйнстрима (си шарп)
да и как я смогу использовать это в других языках ?
Здравствуйте, s.ts, Вы писали:
S>> А чем тебе Дельфевая реализация не нравится???? S>> Перпективы в ненужности использования рефлексии и простота использования наследников типов.
ST>нужна реализация для мэйнстрима (си шарп)
ST>да и как я смогу использовать это в других языках ?
кстати, создаваемые в дельфи @MetaИмя_класса — они являются потомками одного класса ?
Здравствуйте, s.ts, Вы писали:
ST>Здравствуйте, s.ts, Вы писали:
S>>> А чем тебе Дельфевая реализация не нравится???? S>>> Перпективы в ненужности использования рефлексии и простота использования наследников типов.
ST>>нужна реализация для мэйнстрима (си шарп)
ST>>да и как я смогу использовать это в других языках ?
ST>кстати, создаваемые в дельфи @MetaИмя_класса — они являются потомками одного класса ?
Да от @Tclass. Но когда ты создаешь
VirtClass= class of BaseVirtClass;
Все вызовы Finction(VC:VirtClsass):Object;
трансформируются к
Finction(@MetaMyVirtClass.Instanse as BaseVirtClass)
Этим и достигается "статическая" виртуальность
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, s.ts, Вы писали:
ST>нужна реализация для мэйнстрима (си шарп)
Ну это будущее покажет C# стандартизован и ограничен в возможностях.
MSDN Ресеч хочет рассширить возможности. В Delphi руки развязаны. ST>да и как я смогу использовать это в других языках ?
Если классы создавать в Delphi то доступ
через @MetaClassName.@Instanse доступно на любом языке.
Либо ручками делать метаклассы.
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Serginio1, Вы писали:
S>Здравствуйте, s.ts, Вы писали:
ST>>нужна реализация для мэйнстрима (си шарп) S> Ну это будущее покажет C# стандартизован и ограничен в возможностях. S>MSDN Ресеч хочет рассширить возможности. В Delphi руки развязаны. ST>>да и как я смогу использовать это в других языках ? S> Если классы создавать в Delphi то доступ S>через @MetaClassName.@Instanse доступно на любом языке. S>Либо ручками делать метаклассы.
а во всех языках идентификатор может начинаться с @ ?
Здравствуйте, s.ts, Вы писали:
ST>Здравствуйте, Serginio1, Вы писали:
S>>Здравствуйте, s.ts, Вы писали:
ST>>>нужна реализация для мэйнстрима (си шарп) S>> Ну это будущее покажет C# стандартизован и ограничен в возможностях. S>>MSDN Ресеч хочет рассширить возможности. В Delphi руки развязаны. ST>>>да и как я смогу использовать это в других языках ? S>> Если классы создавать в Delphi то доступ S>>через @MetaClassName.@Instanse доступно на любом языке. S>>Либо ручками делать метаклассы.
ST>а во всех языках идентификатор может начинаться с @ ?
Не знаю. Но странно, что в Net не была заложены изначально метаклассы, так как они есть во многих языках.
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, mihailik, Вы писали:
ST>>имхо нужно не за чистоту языка бороться, а как-то решать возникающиек проблемы
M>Реализовать метаклассы это проблема?
да
хочется минимум ручного кодирования
с шаблонами будет легче, но более-менее приличная реализация возможна только на уровне компилятора или макросов или я не прав
S> Ну это будущее покажет C# стандартизован и ограничен в возможностях.
Ну, все-таки прогресс имеется — вот, дженерики сделали...
Авось и доберутся до метаклассов рано или поздно.
Хотелось бы конечно ускорить этот процесс, но как?
Ротор соотв. образом дописать — лично у меня ума не хватит.
Здравствуйте, Serginio1, Вы писали:
S>Здравствуйте, s.ts, Вы писали:
ST>>нужна реализация для мэйнстрима (си шарп) S> Ну это будущее покажет C# стандартизован и ограничен в возможностях. S>MSDN Ресеч хочет рассширить возможности. В Delphi руки развязаны.
по крайней мере настоящее показывает, что лучше от борланда подальше держаться
(это, знаете, похоже на "хороший программист, но как товарищ дерьмо")
1. Для виртуальности нужен контракт. То есть на каждый класс со статическими виртуальными членами нужно завести интерфейс.
2. Нужно завести специальный класс типа брокера, допустим VirtualStaticBroker. Ему передают typeof(Some) и он возвращает интерфейс. Типа VirtualStaticBroker.GetStaticInterface(...).
3. Скрытый класс, который реализует интерфейс придётся строить в Runtime посредством Reflection.Emit. Этой работой будет заниматься VirtualStaticBroker.
4. Чтобы не строить класс на каждый GetStaticInterface нужно его построить и запомнить в Hashtable.
5. Чтобы отделять виртуальные статические методы нужно завести самодельный атрибут вроде как VirtualAttribute.
Здравствуйте, Igor Trofimov, Вы писали:
S>> А что нельзя Дельфевые объекты в Шарпе использовать????? S>>Пиши классы на Delphi используй в шарпе.
iT>не.. уходя — уходи. iT>Если уж пишем на C# — то лучше по возможности не использовать другое. От венигрета ничего хорошего не жди.
Абсолютно не согласен с такой постановкой.
Нужно брать все самое лучшее из различных языков. Благо Net этому благоприятствует.
А вот если не ждать а пользоваться ...
Но на вкус и цвет ...
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, s.ts, Вы писали:
ST>Здравствуйте, Serginio1, Вы писали:
S>>Здравствуйте, s.ts, Вы писали:
ST>>>нужна реализация для мэйнстрима (си шарп) S>> Ну это будущее покажет C# стандартизован и ограничен в возможностях. S>>MSDN Ресеч хочет рассширить возможности. В Delphi руки развязаны.
ST>по крайней мере настоящее показывает, что лучше от борланда подальше держаться
ST>(это, знаете, похоже на "хороший программист, но как товарищ дерьмо")
Мне по барабану — что ждать интересно что есть. И какая разница для MSIL откуда этот код ???
Главное что бы работал.
и солнце б утром не вставало, когда бы не было меня
ST>>хотелось обсудить как это сделать попроще
M>Reflection + Reflection.Emit + атрибуты в такого типа задачах обычно нормально срабатывают.
Хе хе. IL Ассемблер. Проще и главное быстрее????
и солнце б утром не вставало, когда бы не было меня
S> Абсолютно не согласен с такой постановкой. S> Нужно брать все самое лучшее из различных языков. Благо Net этому благоприятствует.
Ну да.. ради одного метода с параметром по умолчанию — лезть в VB, ради одного класса со статическим виртуальным методом — Delphi еще тянуть... нут уж, спасибо, как-нибудь перебьемся
Здравствуйте, Igor Trofimov, Вы писали:
S>> Абсолютно не согласен с такой постановкой. S>> Нужно брать все самое лучшее из различных языков. Благо Net этому благоприятствует.
iT>Ну да.. ради одного метода с параметром по умолчанию — лезть в VB, ради одного класса со статическим виртуальным методом — Delphi еще тянуть... нут уж, спасибо, как-нибудь перебьемся
Во заодно помотрю и методы с параметрами.
А в чем проблема????
А как же раньше сишники то формы на Delphi или COM на VB????
Кстати не вижу проблемы. Да VS (видби другой коленкор) === Delphi 8.
Хозяин — Барин. Но почему то всегда хочется большего.
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, s.ts, Вы писали:
ST>разумнее, конечно, использовать C#, но хотелось бы знать во что мне выльется отсутствие некоей функциональности (автогенерация фабрик классов) в С# ST>а может быть это появится через пол-года и там ?
ST>поэтому и задаю вопрос
Честно говря не очень ясно что за проблема с созданием фабрик. Копируешь файл делаешь одину замену по контексту и все.
Если тебе просто нужно унивесально создавать какой-нить объект, то вообще Activator.CtreateInstance...
... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, mihailik, Вы писали:
ST>>с шаблонами будет легче, но более-менее приличная реализация возможна только на уровне компилятора или макросов или я не прав
M>Может с шаблонами будет и проще немножко.
гораздо проще
M>Reflection + Reflection.Emit + атрибуты в такого типа задачах обычно нормально срабатывают.
конкретнее?
я хочу, чтобы можно было сделать свойство типа "ссылка на класс"
Здравствуйте, Serginio1, Вы писали:
S>Здравствуйте, s.ts, Вы писали:
ST>>Здравствуйте, Serginio1, Вы писали:
S>>>Здравствуйте, s.ts, Вы писали:
ST>>>>нужна реализация для мэйнстрима (си шарп) S>>> Ну это будущее покажет C# стандартизован и ограничен в возможностях. S>>>MSDN Ресеч хочет рассширить возможности. В Delphi руки развязаны.
ST>>по крайней мере настоящее показывает, что лучше от борланда подальше держаться
ST>>(это, знаете, похоже на "хороший программист, но как товарищ дерьмо") S> Мне по барабану — что ждать интересно что есть. И какая разница для MSIL откуда этот код ??? S>Главное что бы работал.
MSIL от борланд может и не работать...
кстати, попробовал я тут Delphi 8, дык геттер должен обязательно называтся "get_*" — ичего не напоминает ?
а по поводу борланд вообще, дык от меня уже, вроде, все апологетам этой конторы досталось...уже рука моя колоть устала
мне тут приходится на CLX писать
за такую "мультиплатформенность" и "технологичность" убивать надо. [подумав получше] жестоко убивать, тем более, что эта хрень еще и не поддерживаться больше не будет.
Здравствуйте, VladD2, Вы писали:
VD>Честно говря не очень ясно что за проблема с созданием фабрик. Копируешь файл делаешь одину замену по контексту и все.
ох##ть можно...
(ты сам оветил бы иначе на такие советы ?)
VD>Если тебе просто нужно унивесально создавать какой-нить объект, то вообще Activator.CtreateInstance...
это хоть что-то
в качестве ссылки что можно использовать ?
имя класса можно ?
или что другое ?
Здравствуйте, s.ts, Вы писали:
ST>ох##ть можно... ST>(ты сам оветил бы иначе на такие советы ?)
В видби будут дженерики, сможешь зваернуть. Хотя по-мне так не так часто это нужно. По крайней мере коллекции делать куда чаще приходится.
VD>>Если тебе просто нужно унивесально создавать какой-нить объект, то вообще Activator.CtreateInstance...
ST>это хоть что-то
ST>в качестве ссылки что можно использовать ? ST>имя класса можно ? ST>или что другое ?
Что ты понимаешь под ссылкой? В МСДН или что туда совать?
В общем, без разницы. Пишел в МСДН-е "Activator class" в индексе и читаешь описание.
... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Igor Trofimov, Вы писали:
iT>Кстати, уже несколько раз с огорчением обнаруживал, что этой замечательной вещи мне после Delphi в шарпе не хватает ;(
Ну, что ж. Остается только радоваться, что ты не программировал на С++ и Лиспе.
... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Serginio1, Вы писали:
S> Абсолютно не согласен с такой постановкой. S> Нужно брать все самое лучшее из различных языков. Благо Net этому благоприятствует. S>А вот если не ждать а пользоваться ... S>Но на вкус и цвет ...
Одно не пойму, а нафиг тебе при этом Шарп.
Кстати, почти уверен что для менеджед-классов этой фигни с виртуальными статическими методами сделать будет нельзя. В дотнете просто нет этого бреда.
... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Igor Trofimov, Вы писали:
ST>>виртуальные статические методы видимо не имеют смысла без метаклассов (тпа фабрик, что ли)
iT>Ну, есть же RuntimeType, вот могли бы при инициализации типа делать singleton-потомок от него, описывающий конкретный тип. Эта штука и возвращалась бы по GetType(). Умела бы создавать экземпляры. Обеспечивала бы поддержку виртуальных (для экземпляра, соответственно — статических виртуальных) методов.
iT>Зря не сделали такое в CLR.
Зечем? Для создания объекта в рантайме есть Activator.
... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, s.ts, Вы писали:
ST>тогда придется ждать пока MS услышит глас вопиющего в пустыне
ST>имхо нужно не за чистоту языка бороться, а как-то решать возникающиек проблемы ST>а придурки, как их не ограничивай в возможностях, все равно напишут что-нибудь грустное для окружающих
Ты чем воду мутить объяснил бы чего хочешь добиться. Мы бы тебе помогли. Представь себе вот программируем уже 2 года на шарпе и ни разу таких проблем как у тебя небыло.
... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, mihailik, Вы писали:
M>Reflection + Reflection.Emit + атрибуты в такого типа задачах обычно нормально срабатывают.
Сдается мне что ему нужно всего лишь в рантайме экземпляр какого-нить класса создать. И товаришь нифига не зная пытается найти решение аналогичное тому что он применял в Дельфи.
... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Serginio1, Вы писали:
S>Здравствуйте, s.ts, Вы писали:
ST>>нужна реализация для мэйнстрима (си шарп) S> Ну это будущее покажет C# стандартизован и ограничен в возможностях. S>MSDN Ресеч хочет рассширить возможности. В Delphi руки развязаны. ST>>да и как я смогу использовать это в других языках ? S> Если классы создавать в Delphi то доступ S>через @MetaClassName.@Instanse доступно на любом языке. S>Либо ручками делать метаклассы.
Никогда этот бред в дотнете работать не будет. Нужно все же понимать, что Дельфи не всилах изменить структуру и функциональность дотнета.
... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, mihailik, Вы писали:
M>Ну ты маньячишь. Товарищ с вопросом пришёл, а ты ему Дельфи.
M>Нам бы таких активных в отдел маркетинга, быстро бы весь рынок захватили
А вы там дельфи продаете?
... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, AndrewVK, Вы писали:
AVK>А можно узнать что конкретно нужно? Задачку описать?
Вообще уже пора всех разыскивающий метаклассы банить. Причем отбанивать только полсе того как пришлют на модераторский мэйл писмо с писменными заверениями, что прочли раздел МСДН посвященный классу Activator и его методу CreateInstance.
... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, s.ts, Вы писали:
ST>>конкретнее? ST>>я хочу, чтобы можно было сделать свойство типа "ссылка на класс"
VD>А за фига? В такой постоновке вопроса тебе нужно написать: VD>
VD>class A
VD>{
VD> static A a;
VD>}
VD>
VD>и все.
VD> static A a;
это ссылка на экземпляр класса, а не на класс
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, mihailik, Вы писали:
M>>Reflection + Reflection.Emit + атрибуты в такого типа задачах обычно нормально срабатывают.
VD>Сдается мне что ему нужно всего лишь в рантайме экземпляр какого-нить класса создать. И товаришь нифига не зная пытается найти решение аналогичное тому что он применял в Дельфи.
сдается мне, это ты, камрад, не понимаешь о чем речь идет
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, s.ts, Вы писали:
ST>>тогда придется ждать пока MS услышит глас вопиющего в пустыне
ST>>имхо нужно не за чистоту языка бороться, а как-то решать возникающиек проблемы ST>>а придурки, как их не ограничивай в возможностях, все равно напишут что-нибудь грустное для окружающих
VD>Ты чем воду мутить объяснил бы чего хочешь добиться. Мы бы тебе помогли. Представь себе вот программируем уже 2 года на шарпе и ни разу таких проблем как у тебя небыло.
Здравствуйте, s.ts, Вы писали:
ST>Здравствуйте, VladD2, Вы писали:
VD>>В общем, без разницы. Пишел в МСДН-е "Activator class" в индексе и читаешь описание.
ST>Ok. посмотрю. закрыто.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, AndrewVK, Вы писали:
AVK>>А можно узнать что конкретно нужно? Задачку описать?
VD>Вообще уже пора всех разыскивающий метаклассы банить. Причем отбанивать только полсе того как пришлют на модераторский мэйл писмо с писменными заверениями, что прочли раздел МСДН посвященный классу Activator и его методу CreateInstance.
опять мимо
я что, должен, искать в топике все твои однообразные высказывания и отвечать односложно ? зачем дублировать сообщения в разных ветках ?
заведи ветку под названием "Activator.CreateInstance" — там обсудим твое предложение (в данном случае оно бессмысленно, а почему — подумай малость)
Здравствуйте, AndrewVK, Вы писали:
AVK>А можно узнать что конкретно нужно? Задачку описать?
дык задачки-то я сам решу просто почти всегда есть несколько способов. одни лучше, другие хуже. я верю, что и вы для решения моей конкретной задачи мне запросто найдете десяток иных способов. вопрос был по конкретной функциональности (static virtual) и ее реализации определенными средствами (.net, возможно, версии 1.2 + C#, возможно версии 2). со своими конкретными задачами я и сам разберусь.
Здравствуйте, s.ts, Вы писали:
ST>дык задачки-то я сам решу просто почти всегда есть несколько способов. одни лучше, другие хуже. я верю, что и вы для решения моей конкретной задачи мне запросто найдете десяток иных способов. ST>вопрос был по конкретной функциональности (static virtual) и ее реализации определенными средствами (.net, возможно, версии 1.2 + C#, возможно версии 2).
На этот вопрос тебе давно ответили — нету. А для того чтобы сказать что есть вместо нужна конкретная задачка в которо тебе это понадобилось.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, Igor Trofimov, Вы писали:
iT>>Кстати, уже несколько раз с огорчением обнаруживал, что этой замечательной вещи мне после Delphi в шарпе не хватает ;(
VD>Ну, что ж. Остается только радоваться, что ты не программировал на С++ и Лиспе.
не знаю как уж там в лиспе, но в с++ сабж. реализуется запросто (шаблоны+макросы)
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, mihailik, Вы писали:
M>>Ну это здорово. Использовать, правда их по делу нельзя, но хоть появляются и то на душе потеплело
VD>
VD>Нда. Делфисты не меньшие маньяки чем С++-ники. Эх. Хорошо маньяки Кобола уже вымерли.
все маньяки плохо кончают (и маньяки дотнета тоже — понятно к чему я ?)
Здравствуйте, s.ts, Вы писали:
ST>и со своим createInstance ты мимо кассы попал
У тебя касса замаскирована. Если бы ты скзал, что тебе нужно, то и проблем не было бы. А ты вмето этого пытаешся применять опыт полученый на не аналогичном продукте. Причем делашь это бездумно и упорно.
... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Слушай, меня твоя игра в морской бой несколько раздражает. Ты или иди "крепче спать". Или объясняй толком что ты хочешь добиться?
ST>я что, должен, искать в топике все твои однообразные высказывания и отвечать односложно ? зачем дублировать сообщения в разных ветках ?
Ты вот это читал?
ST>заведи ветку под названием "Activator.CreateInstance" — там обсудим твое предложение (в данном случае оно бессмысленно, а почему — подумай малость)
Учись задавать вопросы так чтобы на них можно было ответить, тогда и не то не будут предлагать.
... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, AndrewVK, Вы писали:
AVK>На этот вопрос тебе давно ответили — нету. А для того чтобы сказать что есть вместо нужна конкретная задачка в которо тебе это понадобилось.
АВК, снеси этот морской бой во флйм. Там как раз давно таких умных тем небыло.
... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, s.ts, Вы писали:
ST>>все маньяки плохо кончают (и маньяки дотнета тоже — понятно к чему я ?)
VD>Понятно, понятно... понятно что Шарп у тебя второй язык.
в каком смысле ?
1. если в смысле второй по степени владения, а 1-м считать русский, то ты мне явно льстишь
2. если второй по счету, а первым ты считаешь какой-то другой ЯП, то ты меня явно недооцениваешь
не поверишь:
c, c++, matlab, clipper ( несколько ассемблеров и языков субд — не в счет ?) последний год/полтора — дельфи (турбо-паскаль в детском возрасте, видать, тоже не в счет ), далее, кажется, с#
перечислил только то, на чем больше года писал каждый день (ефстефстфенно, не в академических целях)
такие, млин, дела
в общем, что бы ты не имел ввиду, опять пальцем в небо
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, s.ts, Вы писали:
ST>>не знаю как уж там в лиспе, но в с++ сабж. реализуется запросто (шаблоны+макросы)
VD>Ты себе плохо представляешь задачу. С++ язык статический. И в чтобы сделать каие-нибудь рантайм-навороты нужно ой как попатеть.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, s.ts, Вы писали:
ST>>и со своим createInstance ты мимо кассы попал
VD>У тебя касса замаскирована. Если бы ты скзал, что тебе нужно, то и проблем не было бы. А ты вмето этого пытаешся применять опыт полученый на не аналогичном продукте. Причем делашь это бездумно и упорно.
можно было ответить односложно :
" нет. никак. не предвидится. лучшее, что можешь сделать — создавать фабрики классов. для автоматизации этой работы используй меню правка->заменить...других идей у меня нет..."
ну а у кого есть идеи лучше, чем меню "замена", могут высказать свое мнение. и ведь пытались, кабы не появился тут некий "борец за непонятно что, но против" с ответами типа "а зачем?"
опять раздули черти-что
на работу-то время остается? или вся жизнь в форуме ?
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, s.ts, Вы писали:
ST>>посмотрел ST>>мимо
VD>А куда стрелял то?
ты цитирование удалил, чтобы не иметь ответа на свой вопрос чуть выше?
ок. размещаю его ниже:
R>
ST>Здравствуйте, VladD2, Вы писали:
VD>>В общем, без разницы. Пишел в МСДН-е "Activator class" в индексе и читаешь описание.
ST>Ok. посмотрю. закрыто.
VD>Кстати, почти уверен что для менеджед-классов этой фигни с виртуальными статическими методами сделать будет нельзя. В дотнете просто нет этого бреда.
Угу. И очень жаль, что нет этого, как ты выразился "бреда".
Имхо, "бред" — это скорее inplace-делегаты и yield (или как он правильно пишется?).
А точнее, не бред — а не такая уж и нужная и бесспорная вещь.
А вот возможность получить ссылку на тип, обязательно являющийся подклассом заданного типа — это очень и очень ценная возможность, повышающая типобезопасность. без нее приходится делать тупые проверки и потенциально небезопасный кастинг вниз по иерархии.
Или, например, возможность узнать у типа какую-то информацию о типе, но не только банальный FullName, а что-то более интересное.
Например, для любого типа typed dataset узнать информацию о структуре, не создавая экземпляра за счет виртуальных членов типа dataset. Было бы неплохо.
Расскажи, как вы, выходцы из C++, обделенного такими возможностями, решаете подобные задачи.
Здравствуйте, s.ts, Вы писали:
ST>c, c++, matlab, clipper ( несколько ассемблеров и языков субд — не в счет ?) последний год/полтора — дельфи (турбо-паскаль в детском возрасте, видать, тоже не в счет ), далее, кажется, с#
ST>перечислил только то, на чем больше года писал каждый день (ефстефстфенно, не в академических целях)
ST>такие, млин, дела
Возможно. Но то упорство с которым ты пытаешся получить отсуствующую и не нужную возможность наводит на мысли. Странно, что ты не потребовал множественного наследования, обработки формул в мат-виде, и изам-инструкций для управления БД.
ST>в общем, что бы ты не имел ввиду, опять пальцем в небо
Ну, вот такой уж ты игрок в морской бой. Все вынуждаешь бить по площадям. А я как-то не очень люблю эту игру.
... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Igor Trofimov, Вы писали:
iT>Угу. И очень жаль, что нет этого, как ты выразился "бреда". iT>Имхо, "бред" — это скорее inplace-делегаты и yield (или как он правильно пишется?). iT>А точнее, не бред — а не такая уж и нужная и бесспорная вещь.
Это все синтаксический сахар. Ничего концептуального. Удобно, только и всего.
iT>А вот возможность получить ссылку на тип, обязательно являющийся подклассом заданного типа — это очень и очень ценная возможность, повышающая типобезопасность. без нее приходится делать тупые проверки и потенциально небезопасный кастинг вниз по иерархии.
ДаунКастинг принципиально не может быть опасным. Ты видимо имел ввиду наоборт АпКастинг.
Честно говоря вообще не ясно зачем вы там химичите в таких объемах. Ну, да ваше дело. То что было в Дешьфи — это чистой воды грязный хак. Причем от АпКастинга он не спасает. Один фиг придется делать приведение. Ни в одной книге по ООП ты не найдеш такой фичи как в дельфи.
iT>Или, например, возможность узнать у типа какую-то информацию о типе, но не только банальный FullName, а что-то более интересное.
А в чем проблема?
iT>Например, для любого типа typed dataset узнать информацию о структуре, не создавая экземпляра за счет виртуальных членов типа dataset.
Да нет проблем. Типизированный датасет — это обычный класс дотнета. Получай его описание в виде Type и читай все что хочешь. Вот только зачем тебе это? В рантайме куда удобнее и быстрее читать обычный датастет (если он создан динамически), а если он создан статически, то нифига фигней заниматься используй его как известный тип и будет тебе счастье.
iT> Было бы неплохо. iT>Расскажи, как вы, выходцы из C++, обделенного такими возможностями, решаете подобные задачи.
Везде есть свои подходы, свои приемущества и недостатки. На тех же шаблонах народ творин совершенно не вероятные вещи. Только за частую — это такой же изврат как только что предложил ты.
Что же касается "вы... из С++"... у меня нет отдельной любви к С++, хотя на нем я программировал наверно дольше всего. Я и на дельфи года три пописал. Так что более чем реально представляю возможности. У дотнетных языков возможностей не меньше, просто их нужно с умом и по месту использовать. Задница как раз и начинается, когда пытаются эмулировать что-то на чем-то не вместо того чтобы решать свои задачи оптимальным образом.
... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, s.ts, Вы писали:
ST>можно было ответить односложно : ST>" нет. никак. не предвидится. лучшее, что можешь сделать — создавать фабрики классов. для автоматизации этой работы используй меню правка->заменить...других идей у меня нет..."
Тебе это человек пять ответило, но тебе же мало.
ST>ну а у кого есть идеи лучше, чем меню "замена", могут высказать свое мнение. и ведь пытались, кабы не появился тут некий "борец за непонятно что, но против" с ответами типа "а зачем?"
Вообще-то это вопрос. Но можно ответить и так. На дурацкие вопросы даем одекватные ответы.
ST>на работу-то время остается? или вся жизнь в форуме ? ST>
Ты в календарь заглядываешь?
И вообще, что-бы не заботиться о своем благосостоянии, работе и т.п. У меня то проблем ни с работой, ни с зарплатой нет. Чего и вам желаю.
... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
VD> ДаунКастинг принципиально не может быть опасным. Ты видимо имел ввиду наоборт АпКастинг.
Ну это как дерево рисовать С корнем внизу или с корнем наверху.
iT>>Например, для любого типа typed dataset узнать информацию о структуре, не создавая экземпляра за счет виртуальных членов типа dataset.
VD>Да нет проблем. Типизированный датасет — это обычный класс дотнета. Получай его описание в виде Type и читай все что хочешь.
Замечательно. Как мне из его Type прочитать, сколько таблиц входит в этот typed DataSet и какие у них колонки? Создавать только для этого экземпляр я не хочу — это уродливо!
Заметь, эта информация статична по отношению к конкретному типу датасета — она общая для всех его экземпляров. Хочется получить ее обобщенно из типа. Зная, что этот тип — подтип типа DataSet.
VD>Везде есть свои подходы, свои приемущества и недостатки. На тех же шаблонах народ творин совершенно не вероятные вещи. Только за частую — это такой же изврат как только что предложил ты.
Язаметил, ты очень любишь всякие нехорошие слова "Бред, изврат"
Изврат — это создавать экземпляр объекта, чтобы получить информацию, общую для всех экземпляров, то есть информацию о типе.
VD>Что же касается "вы... из С++"... у меня нет отдельной любви к С++, хотя на нем я программировал наверно дольше всего. Я и на дельфи года три пописал. Так что более чем реально представляю возможности. У дотнетных языков возможностей не меньше, просто их нужно с умом и по месту использовать. Задница как раз и начинается, когда пытаются эмулировать что-то на чем-то не вместо того чтобы решать свои задачи оптимальным образом.
Никто не собирается ничего "эмулировать". Задачи, которые я приводил — вытекают не из возможностей Delphi или другого языка, где это есть, а из самой парадигмы ООП. И именно с отсутствующими возможностями они решались бы оптимальным способом, а не через задницу, как это приходится делать сейчас.
Языки можно сравнивать, если они работают в некоторой общей парадигме (имхо, поэтому C# и Perl несравнимы, а C#, Delphi, Java — сравнимы).
И вот, просто работая в рамках концепции ООП и возникают все эти задачки.
Возьмем тот же С++, думаю, не будешь отрицать, что там работа с типами вообще очень сильно ограничена. А хочется. Почему хочется? Потому что это логично вытекает из парадигмы. Объекты, классы. Сохранили объект виртуальным методом в поток — а как восстанавливать? Нужна информация о типе.
Вот точно также и возможности, о которых мы тут говорим, вытекают из парадигмы. Да, они нужны чуть реже, без них обойтись, выкрутиться, проще, чем без Activator.CreateInstance. Но они очень логично и целостно вписываются в общую картину. Поэтому когда в одном языке эти возможности есть, а в другом — их нет, просто нет, это как минимум вызывает недоумение. ПОЧЕМУ их нет? И не говори, что они не нужны. Нужны.
Ты же постановил аксиомой — "в .net языках есть все, что нужно, кому этого мало — тот дурак".
Итак, я привел тебе два конкретных примера, когда мне хочется расширенной информации о типе на уровне языка — расскажи, как их "оптимально решать" в C#.
решения на Delphi примерно такие:
1. Передача типа — потомка заданного типа
type TControlClass = class of TControl;
procedure AddControl(ControlClass : TControlClass);
2. Извлечение информации о типе, специфичной для всех типов — подтипов заданного
// Базовый типtype DataSet = class(Component)
...
// Виртуальный член типаclass function GetDataSetName : string; virtual;
...
end;
// Ссылка на тип, производный от базового
TDataSetClass = class of TDataSet;
...
// Переменная ссылки на такой типvar DataSetClass : TDataSetClass;
....
// Извлечение информации о конкретном типе
ShowMessage(DataSetClass.GetDataSetName);
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, s.ts, Вы писали:
ST>>c, c++, matlab, clipper ( несколько ассемблеров и языков субд — не в счет ?) последний год/полтора — дельфи (турбо-паскаль в детском возрасте, видать, тоже не в счет ), далее, кажется, с#
ST>>перечислил только то, на чем больше года писал каждый день (ефстефстфенно, не в академических целях)
ST>>такие, млин, дела
VD>Возможно. Но то упорство с которым ты пытаешся получить отсуствующую и не нужную возможность наводит на мысли. Странно, что ты не потребовал множественного наследования, обработки формул в мат-виде, и изам-инструкций для управления БД.
а насчет нужности... хотелось бы иметь все... но за приемлемую цену и в приемлемые сроки... поэтому всего и нету в одном месте... на счет ненужности лучше не говорить, а то тут еще на 100 постов ветка вырастет
ST>>в общем, что бы ты не имел ввиду, опять пальцем в небо
VD>Ну, вот такой уж ты игрок в морской бой. Все вынуждаешь бить по площадям. А я как-то не очень люблю эту игру.
ладно, мир
уже суббота а я еще на работе
p.s. очередной раз предлагаю ввести правило, что участники обсуждений обходятся без взаимных оценок и ярлыков (мне что, теперь ник менять на "A1потопил"? ), а также не занимаются оценкой знаний друг друга (короче, следят за базаром ) — надоело читать "ты не знаешь/не понимаешь-сам не знаешь/не понимаешь"
Здравствуйте, Igor Trofimov, Вы писали:
iT>Замечательно. Как мне из его Type прочитать, сколько таблиц входит в этот typed DataSet и какие у них колонки? Создавать только для этого экземпляр я не хочу — это уродливо!
iT>Заметь, эта информация статична по отношению к конкретному типу датасета — она общая для всех его экземпляров. Хочется получить ее обобщенно из типа. Зная, что этот тип — подтип типа DataSet.
По моему это какая то ерунда. Если информация статична значит она в статик полях. Прочитать информацию из статик полей, не создавая экзепляра можно. Если же эта информация хранится таки в экземпляре значит эта информация не статична.
iT>Изврат — это создавать экземпляр объекта, чтобы получить информацию, общую для всех экземпляров, то есть информацию о типе.
Точно изврат. А нафига? Что это за информация такая, что экземпляр нужен?
iT>Никто не собирается ничего "эмулировать". Задачи, которые я приводил — вытекают не из возможностей Delphi или другого языка, где это есть, а из самой парадигмы ООП.
Вот и интересно что это за задачи такие. Предыдущий оратор на этот вопрос заявил что у него времени мало и ему работать нужно.
iT> И именно с отсутствующими возможностями они решались бы оптимальным способом, а не через задницу, как это приходится делать сейчас.
Что именно приходится делать через задницу?
iT>И вот, просто работая в рамках концепции ООП и возникают все эти задачки. iT>Возьмем тот же С++, думаю, не будешь отрицать, что там работа с типами вообще очень сильно ограничена. А хочется. Почему хочется? Потому что это логично вытекает из парадигмы.
Из парадигмы ООП? Ничуть. ООП не предполагает наличие неизвестных на стадии компиляции типов. Это уже другая парадигма — компонентная модель. А ее в С++ нет, не поддерживает он ее. Потому и метаданных нет.
iT>Вот точно также и возможности, о которых мы тут говорим, вытекают из парадигмы. Да, они нужны чуть реже, без них обойтись, выкрутиться, проще, чем без Activator.CreateInstance. Но они очень логично и целостно вписываются в общую картину. Поэтому когда в одном языке эти возможности есть, а в другом — их нет, просто нет, это как минимум вызывает недоумение. ПОЧЕМУ их нет? И не говори, что они не нужны. Нужны.
Вот и хотелось бы узнать зачем. Я как то ни разу потребности не испытал, хотя на Дельфи в свое время писал очень много.
iT>Ты же постановил аксиомой — "в .net языках есть все, что нужно, кому этого мало — тот дурак".
Нет конечно, ничего такого он не подразумевал. Просто когда говорят что что то нужно, потому что очень хочется, никак не обосновывая то естественно возникает вопрос — нафига?
iT>Итак, я привел тебе два конкретных примера,
AVK>По моему это какая то ерунда. Если информация статична значит она в статик полях. Прочитать информацию из статик полей, не создавая экзепляра можно. Если же эта информация хранится таки в экземпляре значит эта информация не статична.
Ну, может, я плохо сформулировал, но, надеюсь, сама проблема понятна?
Да, информаци статична для конкретного типа. И еще она — виртуальна, потому что для тиров-потомков может отличаться. Я хочу, значя тип не точно, получить эту информацию, как я вызываю виртуальный метод объекта, не зная точно его типа. Чего ж тут неясного?
AVK>Точно изврат. А нафига? Что это за информация такая, что экземпляр нужен? AVK>Вот и интересно что это за задачи такие. Предыдущий оратор на этот вопрос заявил что у него времени мало и ему работать нужно. AVK>Что именно приходится делать через задницу?
Я привел пример задачи. И раньше приводил. Еще повторять?
AVK>Из парадигмы ООП? Ничуть. ООП не предполагает наличие неизвестных на стадии компиляции типов. Это уже другая парадигма — компонентная модель. А ее в С++ нет, не поддерживает он ее. Потому и метаданных нет.
Согласен. Ну, значит, это следует из парадигмы компонентной модели
Вот тип на этапе компиляции не известен. Но мне хочется про него информацию. Не только самую общую — как FullName, но и более детальную, если тип известен с точностью до некоторого супертипа.
В принципе в .net эту информацию можно вытаскивать через атрибуты — но это половинчатое решение. Потому что наличие/отсутствие атрибута определенного типа — это все-таки соглашение. А статический виртуальный метод — это жесткий контракт типа.
AVK>Вот и хотелось бы узнать зачем. Я как то ни разу потребности не испытал, хотя на Дельфи в свое время писал очень много.
Очень странно. А если заглянуть в исходники VCL и поискать там "class of" то почему-то находится прилично вхождений. Вот разработчикам VCL это все-таки почему-то нужно было И мне тоже бывало нужно.
AVK>Какие то они некудышние.
Замечательно!!! Пять баллов!
Все столько просили конкретные примеры задач, а когда им эти примеры выдают, выясняется, что они "какие-то не такие" Ну, да, "не такие". Потому что на C# не решаются по-человечески.
Здравствуйте, Igor Trofimov, Вы писали:
iT>Ну, может, я плохо сформулировал, но, надеюсь, сама проблема понятна?
В том то и дело что нет.
iT>Да, информаци статична для конкретного типа. И еще она — виртуальна, потому что для тиров-потомков может отличаться. Я хочу, значя тип не точно, получить эту информацию, как я вызываю виртуальный метод объекта, не зная точно его типа. Чего ж тут неясного?
Что тебе мешает пользоваться рефлекшеном и атрибутами?
AVK>>Точно изврат. А нафига? Что это за информация такая, что экземпляр нужен? AVK>>Вот и интересно что это за задачи такие. Предыдущий оратор на этот вопрос заявил что у него времени мало и ему работать нужно. AVK>>Что именно приходится делать через задницу?
iT>Я привел пример задачи. И раньше приводил. Еще повторять?
Не, ты привел не пример задачи, а пример конкретного решения. Потому я и написал что твои при меры не годятся.
iT>Согласен. Ну, значит, это следует из парадигмы компонентной модели
Да. И рефлекшен + атрибуты очень неплохо в эту концепцию ложаться. Почему не как в Дельфи? Тоже вобщем то понятно — практика показала что Дельфи-лайк стиль слишком негибок и плохо себя ведет при полном отсутствии какой бы то ни было информации на момент компиляции. В условиях дотнета подобный подход показал бы себя еще хуже.
iT>Вот тип на этапе компиляции не известен. Но мне хочется про него информацию. Не только самую общую — как FullName, но и более детальную, если тип известен с точностью до некоторого супертипа.
При помощи рефлекшена ты можешь получить всю наличествующую информацию, а при помощи атрибутов добавить еще и свою собственную. Дельфовый стиль полезен на этапе компиляции. В рантайме он не дает абсолютно никаких преимуществ.
iT>В принципе в .net эту информацию можно вытаскивать через атрибуты — но это половинчатое решение.
Это более полное решение нежели в Дельфи. Чтобы это понять достаточно сравнить возможности Дельфевого Object Inspector и PropertyGrid дотнета.
iT> Потому что наличие/отсутствие атрибута определенного типа — это все-таки соглашение.
И это здорово, поскольку механика атрибутов ортогональна как системе типов рантайма, так и другим схемам атрибутов. А это значит что атрибутные схемы не будут вмешиваться в структуру программы. Сравни к при меру published в Дельфи и BrowsableAttribute в дотнете. Первое — расширение языка специально под конретные потребности разработчиков самого IDE. Второе абсолютно стандартная для дотнета механика, полный аналог которой ты можешь соорудить сам без каких либо затруднений.
iT> А статический виртуальный метод — это жесткий контракт типа.
Жесткий он только на этапе компиляции. Причем очень специфичный. Т.е. накладывающий строго определенные ограничения. Уж лучше тогда дженерики с их констрейнтами. Тоже не идеал, по куда гибче.
iT>Очень странно. А если заглянуть в исходники VCL и поискать там "class of" то почему-то находится прилично вхождений.
Я тебе скажу почему. Потому что в Дельфи нет рефлекшена.
iT> Вот разработчикам VCL это все-таки почему-то нужно было
Если бы они додумали мысль до конца я думаю они бы пришли к более гибкому решению. А так получился просто хак языка и рантайма под конкретную задачу.
AVK>>Какие то они некудышние.
iT>Замечательно!!! Пять баллов! iT>Все столько просили конкретные примеры задач, а когда им эти примеры выдают, выясняется, что они "какие-то не такие"
Потому что это примеры конкретных решений, а не задач.
iT> Ну, да, "не такие". Потому что на C# не решаются по-человечески.
Попытка слепо скопировать решения с одной платформы на другую никогда хорошо не кончались.
AVK>Что тебе мешает пользоваться рефлекшеном и атрибутами?
Ну, так и выкручиваюсь, если надо, но вообще атрибуты для решения этих задач по сравнению с виртуальными статическими членами имеют следующие существенные минусы:
1. Это банально неудобно. Сравни DataTypeClass.Name и выражение для вычисления атрибута.
2. Атрибуты могут содержать только неизменяемую информацию. И гарантированно известную на этапе компиляции.
3. Атрибут — необязателен. Его можно забыть поставить. Нет жесткого контракта.
AVK>Не, ты привел не пример задачи, а пример конкретного решения. Потому я и написал что твои при меры не годятся.
Задачи я тоже приводил. Извини, но если человек знает Delphi, то по трем строчкам решения понять задачу не должно составить труда. Впрочем, текстом я их тоже формулировал. В общем, демагогия пошла. Решения на шарпе не получаются — значит, переходим на критику задач
AVK>Да. И рефлекшен + атрибуты очень неплохо в эту концепцию ложаться. Почему не как в Дельфи? Тоже вобщем то понятно — практика показала что Дельфи-лайк стиль слишком негибок и плохо себя ведет при полном отсутствии какой бы то ни было информации на момент компиляции. В условиях дотнета подобный подход показал бы себя еще хуже.
Мнэ? Что ты подразумеваешь под Delphi-like? Чем бы было хуже, если бы в добавку к атрибутам была бы более жесткая возможность извлечения информации о типах??? Тут я не понял.
AVK>При помощи рефлекшена ты можешь получить всю наличествующую информацию, а при помощи атрибутов добавить еще и свою собственную. Дельфовый стиль полезен на этапе компиляции. В рантайме он не дает абсолютно никаких преимуществ.
Атрибуты — это мощно, как встроенный ассемблер Очень мощно. Но это более низкий уровень. Код, написанный с массовым применением атрибутов некрасив, многословен, изобилует проверками того, чего не должно быть.
Вернемся моей задачке — информаия о структре DataSet'а. Там может быть 10 методов. Воротить 10 атрибутов? Некрасиво, неудобно, уродливо!
Кстати, еще бы не помешали интерфейсы типа.
AVK>Это более полное решение нежели в Дельфи. Чтобы это понять достаточно сравнить возможности Дельфевого Object Inspector и PropertyGrid дотнета.
И какие между ними принципиальные отличия?
Учти, что дельфийскому ObjectInspectory уже 10 лет и он создавался, когда в языке вообще не было понятия интерфейса И вообще это нашей темы не касается. В обоих случаях нужна только обобщенная информация о типах, а мы говорили, о custom-информации о типах. Кстати, в Delphi можно было написать редактор свойства для уже существующего типа
iT>> Потому что наличие/отсутствие атрибута определенного типа — это все-таки соглашение.
AVK>И это здорово, поскольку механика атрибутов ортогональна как системе типов рантайма, так и другим схемам атрибутов. А это значит что атрибутные схемы не будут вмешиваться в структуру программы. Сравни к при меру published в Дельфи и BrowsableAttribute в дотнете. Первое — расширение языка специально под конретные потребности разработчиков самого IDE. Второе абсолютно стандартная для дотнета механика, полный аналог которой ты можешь соорудить сам без каких либо затруднений.
Я вовсе не отрицаю пользу атрибутов. И Абсолютно согласен, что [Browsable] — это качественно лучшее решение, нежели published.
iT>> А статический виртуальный метод — это жесткий контракт типа.
AVK>Жесткий он только на этапе компиляции. Причем очень специфичный. Т.е. накладывающий строго определенные ограничения. Уж лучше тогда дженерики с их констрейнтами. Тоже не идеал, по куда гибче.
А иногда жесткость — это имеенно то, что нужно. Что — не согласен? Может вернемся к позднему связыванию всех вызовов по имени метода? нет?
AVK>Я тебе скажу почему. Потому что в Дельфи нет рефлекшена.
Не-а. Не поэтому. Возможно, не только поэтому. Еще потому что там не было интерфейсов и еще потому, что там есть статические виртуальные члены
Хорошо, достаем пример из VCL. Любой TField имеет статический виртуальный метод, позволяющий проверить некоторое значение на корректность для данного поля. Это ты не сделаешь атрибутом. Для этого не нужно создавать экземпляр поля, потому что эта логика определяется его типом. И эта логика виртуальна.
Как это делать на C#? Ну, как водится — атрибут, содержащий тип, который реализует интерфейс проверки.
Вот это я и называю — через задницу Потому что длинннее, сложнее, лишнее создание никому ненужного экземпляра и т.п.
iT>> Вот разработчикам VCL это все-таки почему-то нужно было
AVK>Если бы они додумали мысль до конца я думаю они бы пришли к более гибкому решению. А так получился просто хак языка и рантайма под конкретную задачу.
Блин, ну почему — хак??? У одного — бред и изврат, у другого — хак...
А я скажу так — очень хорошая, полностью осмысленная, стройная языковая конструкция, чрезвычайно нужная при создании высокодинамичных систем. Криво, но эмулируемая с помощью атрибутов. Потому что ими все можно эмулировать, что имеет отношение к типам. Ими можно виртуальные методы эмулировать. легко! Давайте выкинем ключевые слова virtual, abstract, override и будем это делать с помощью атрибутов. Гибко! Ортогонально!
Почему имя типа — не атрибут? Почему предок типа — не атрибут?
AVK>Попытка слепо скопировать решения с одной платформы на другую никогда хорошо не кончались.
Смотрим выше про парадигмы. Delphi и C# — это не Perl и C#. Парадигмы очень близки. Задачи все очень похожи.
Отмазки, все гнилые отмазки.
ST>>>хотелось обсудить как это сделать попроще
M>>Reflection + Reflection.Emit + атрибуты в такого типа задачах обычно нормально срабатывают. S> Хе хе. IL Ассемблер. Проще и главное быстрее????
А ну давай не махай руками! Что ты предлагаешь и почему считаешь, что это проще?
M>>Ну это здорово. Использовать, правда их по делу нельзя, но хоть появляются и то на душе потеплело
VD>
VD>Нда. Делфисты не меньшие маньяки чем С++-ники.
Э. Ну, просто мой сарказм был слишком сильно замаскирован
VD>Эх. Хорошо маньяки Кобола уже вымерли.
На последней Kiev .NET User Group один товарищ защищал VB и заодно и Кобол. Выглядело смешно, но у всех были такие умные лица, что я постеснялся гоготать
Здравствуйте, mihailik, Вы писали:
M>>>Может с шаблонами будет и проще немножко.
ST>>гораздо проще
M>Ты уверен? Поделись, интерестная головоломка.
M>Я тоже поначалу так подумал — генерики всё решат. Но вот прикинул на секундочку и вроде не получается.
M>Кажется, в .NET-генериках нельзя поставить restriction на существование статического метода. А без этого особого проку нет
Здравствуйте, Igor Trofimov, Вы писали:
AVK>>Что тебе мешает пользоваться рефлекшеном и атрибутами?
iT>Ну, так и выкручиваюсь, если надо, но вообще атрибуты для решения этих задач по сравнению с виртуальными статическими членами имеют следующие существенные минусы:
iT>1. Это банально неудобно. Сравни DataTypeClass.Name и выражение для вычисления атрибута.
Да никакой такой большой разницы нет. Особенно если лезть не напрямую, а через TypeDescriptor.
iT>2. Атрибуты могут содержать только неизменяемую информацию. И гарантированно известную на этапе компиляции.
Нет конечно. Это относится только к параметрам конструкторов.
iT>Задачи я тоже приводил. Извини, но если человек знает Delphi, то по трем строчкам решения понять задачу не должно составить труда.
Нет и еще раз нет. Это решения и ничего больше. По твои трем строчкам можно создать только очень близкое подобие, которое естественно будет кривым. Пытаться что то менять невозможно, поскольку это скорее всего приведет к изменению каких либо характеристик, а не зная исходной задачи понять допустимо ли это невозможно.
iT> Впрочем, текстом я их тоже формулировал.
Что то не заметил. Заметил только решения с использованием Дельфи.
iT>Решения на шарпе не получаются — значит, переходим на критику задач
Решения чего? Я тебе так же могу сказать — вот код
[XmlIgnore]
public string SomeProperty
{
}
Расскажи мне как подобную задачу решать на Дельфи? Что, не знаешь? Вот то то и оно.
AVK>>Да. И рефлекшен + атрибуты очень неплохо в эту концепцию ложаться. Почему не как в Дельфи? Тоже вобщем то понятно — практика показала что Дельфи-лайк стиль слишком негибок и плохо себя ведет при полном отсутствии какой бы то ни было информации на момент компиляции. В условиях дотнета подобный подход показал бы себя еще хуже.
iT>Мнэ? Что ты подразумеваешь под Delphi-like?
Решения вроде статической дельфевой виртуальности, виртуальных конструкторов, published модификатора и т.п.
iT>Чем бы было хуже, если бы в добавку к атрибутам была бы более жесткая возможность извлечения информации о типах???
В добавку? Тем что появилось бы две конструкции языка, решающие одну и ту же задачу. Это очень плохо.
iT>Атрибуты — это мощно, как встроенный ассемблер Очень мощно. Но это более низкий уровень.
Кастомные атрибуты более низкий уровень по сравнению с системой типов? Что то я совсем перестаю тебя понимать.
iT> Код, написанный с массовым применением атрибутов некрасив, многословен, изобилует проверками того, чего не должно быть.
Вы просто не умеете их готовить.
iT>Вернемся моей задачке — информаия о структре DataSet'а.
Какая информация?
iT> Там может быть 10 методов. Воротить 10 атрибутов?
Атрибуты вобще то можно еще и к классам применять. А если ума нет то можно еще к параметрам методов атрибуты прицепить, причем для каждого свой.
iT>Кстати, еще бы не помешали интерфейсы типа.
Вот вот, начинается хардкодная городильня. А атрибуты уже вполне способны интерфейсы реализовывать без дополнительных наворотов и заточек.
AVK>>Это более полное решение нежели в Дельфи. Чтобы это понять достаточно сравнить возможности Дельфевого Object Inspector и PropertyGrid дотнета.
iT>И какие между ними принципиальные отличия?
Под PropertyGrid не был заточен CLR и C#.
iT>Учти, что дельфийскому ObjectInspectory уже 10 лет и он создавался, когда в языке вообще не было понятия интерфейса
Ну коль такие аргументы пошли в ход тогда я тебя спрошу — почему ни в одном новом языке — будь то джава, шарп или vb.net нет статической виртуальности. Значит идея этой самой виртуальности оказалась неперспективной.
iT> И вообще это нашей темы не касается.
Касается, поскольку работает PG как раз на основе той самой информации, привязанной к конкретному типу. Красивое и очень мощное решение без необходимости прибегать к виртуальным статическим методам.
iT> В обоих случаях нужна только обобщенная информация о типах, а мы говорили, о custom-информации о типах.
Ты плохо себе представляешь что такое PG. Он способен понимать очень много кастомной информации. Попробуй например локализовать Object Inspector.
iT> Кстати, в Delphi можно было написать редактор свойства для уже существующего типа
Что смешного? В PG тоже можно. И это все что там можно сделать. А локализация? А состав свойств? А динамические свойства? А менять названия/видимость/редактор/все-что=хочешь у свойств на лету? Налицо значительное преимущество атрибутной модели дотнета над дельфовой.
iT>Я вовсе не отрицаю пользу атрибутов. И Абсолютно согласен, что [Browsable] — это качественно лучшее решение, нежели published.
Ну так с виртуальной статикой тоже самое. Атрибуты гибче, универсальнее и не завязаны на систему типов.
AVK>>Жесткий он только на этапе компиляции. Причем очень специфичный. Т.е. накладывающий строго определенные ограничения. Уж лучше тогда дженерики с их констрейнтами. Тоже не идеал, по куда гибче.
iT>А иногда жесткость — это имеенно то, что нужно. Что — не согласен?
Нет, потому что просто жесткость никому не нужна. Нужна управляемая жесткость. Дженерики позволяют жесткостью ограничений хоть как то управлять и не коррелировать с деревом наследования.
iT>еще потому, что там есть статические виртуальные члены
Мне это напоминает убежденность Мики в том что сессии веб-сервисов это преимущество сервисов перед ремоутингом.
iT>Как это делать на C#? Ну, как водится — атрибут, содержащий тип, который реализует интерфейс проверки. iT>Вот это я и называю — через задницу
Кому как. По мне так через задницу как раз первый вариант, поскольку если помимо TField мне понадобится такая же проверка в каком нибудь TProperty или TColumn я буду ее писать по новой. А если мне понадобится еще и перекрыть проверку у конкретного свойства типа TField то ситуация становится еще более фиговой.
AVK>>Если бы они додумали мысль до конца я думаю они бы пришли к более гибкому решению. А так получился просто хак языка и рантайма под конкретную задачу.
iT>Блин, ну почему — хак??? У одного — бред и изврат, у другого — хак...
Потому что хак. Узкий набор возможностей, которые были необходимы создателям VCL. Сделать что то сверх того, что делается в VCL невозможно.
iT>А я скажу так — очень хорошая, полностью осмысленная, стройная языковая конструкция, чрезвычайно нужная при создании высокодинамичных систем. Криво, но эмулируемая с помощью атрибутов.
Во! О чем я и говорю. Вместо того чтобы решать задачи вы эмулируете то что есть в Дельфи.
iT> Потому что ими все можно эмулировать, что имеет отношение к типам.
Не, не эмулировать. Это их предназначение — расширять информацию о типе. Точно так же можно сказать что статическая виртуальность эмулирует один из аспектов применения атрибутов.
iT> Ими можно виртуальные методы эмулировать. легко! Давайте выкинем ключевые слова virtual, abstract, override и будем это делать с помощью атрибутов. Гибко! Ортогонально! iT>Почему имя типа — не атрибут? Почему предок типа — не атрибут?
Потому что эти данные необходимы рантайму (не языку заметь, и не среде разработки).
AVK>>Попытка слепо скопировать решения с одной платформы на другую никогда хорошо не кончались. iT>Смотрим выше про парадигмы. Delphi и C# — это не Perl и C#. Парадигмы очень близки. Задачи все очень похожи.
Здравствуйте, mihailik, Вы писали:
M>>>Может с шаблонами будет и проще немножко.
ST>>гораздо проще
M>Ты уверен? Поделись, интерестная головоломка.
M>Я тоже поначалу так подумал — генерики всё решат. Но вот прикинул на секундочку и вроде не получается.
M>Кажется, в .NET-генериках нельзя поставить restriction на существование статического метода. А без этого особого проку нет
статической проверки типов действительно наверное не получится,
но писать меньше и copy/paste не требуется
м.б. что-то типа:
class RTTIMyClass : RTTIBase<MyClass>
{
}
а в RTTIBase есть что-то типа void execStaticMethod(name string);
впрочем, это все равно будет такой изврат. что проще обойтись без...
ST>впрочем, это все равно будет такой изврат. что проще обойтись без...
жить-то можно без этого. не понимаю. почему некоторые это так близко к сердцу восприняли
так же как можно жить без шаблонов, без переопределения операторов, без свойств, без ... чего-то еще
ST>а в RTTIBase есть что-то типа void execStaticMethod(name string);
По имени как-то некрасиво. Да и параметры, как ты параметры передавать будешь? Не, это не очень способ.
Я тут описывал примерно, как можно накрутить чтобы было прилично сносно. Делается интерфейс, в рантайме генерируется для него реализация-прокся под каждый класс. Должно работать без сильных тормозов.
M>>Кажется, в .NET-генериках нельзя поставить restriction на существование статического метода.
AVK>Хинт — статические методы могут возвращать вполне динамические экземпляры.
Вот не понял намёка
Генерики помогли бы, если бы можно было примерно так:
class StaticVirtualHelper<T>
{
public static DoSome(int a, int b, int c)
{
T.DoSome(a,b,c);
}
}
Но вызов T.DoSome() невозможен, так как нельзя потребовать от T наличия статического метода.
Здравствуйте, mihailik, Вы писали:
ST>>а в RTTIBase есть что-то типа void execStaticMethod(name string);
M>По имени как-то некрасиво. Да и параметры, как ты параметры передавать будешь? Не, это не очень способ.
M>Я тут описывал примерно, как можно накрутить чтобы было прилично сносно. Делается интерфейс, в рантайме генерируется для него реализация-прокся под каждый класс. Должно работать без сильных тормозов.
дык это вроде бы дельфя и делает
это да, здорово (в плане быстродействия), но проблема в том, чтобы работать с этим "до компиляции", т.е. не в рантайм
не понятно каков будет синтаксис вызова такого метода, если интерфейс еще не сгенерен ?
наверное, типа того :
FindInterfaceEntryFor('MyClass').ExecMyMethod('') — так ?
p.s.
кстати, можно будет в дотнете 1.2 создавать шаблоны для интерфейсов ? (это я о дженериках)
VD>Никогда этот бред в дотнете работать не будет. Нужно все же понимать, что Дельфи не всилах изменить структуру и функциональность дотнета.
Виртуальные статические методы в Delphi.NET присуствуют, это факт. Они, конечно, видны не как статические методы с точки зрения C#. В общем, польза от них возможна только не выходя из Дельфи.
А чего в кондуктора не пошёл? Родителей расстроить боишься? Ездил бы себе весь день по маршруту и никаких Микрософтовских инсинуаций не боялся.
ST>я вот поначалу радовался, но как колпнешь — нету счастия
А счастье в виртуальных статических классах?
Ты же знаешь, сейчас за деньги можно многое купить. Накопи денег, люди тебе C#-компилятор за милую душу перепишут. Я например, по бедности своей хохляцкой, всего за три штуки баксов встроил бы прямо в C# этот многострадальный static virtual. Чики-пуки, даже без суррогатностей.
ST>>впрочем, это все равно будет такой изврат. что проще обойтись без...
ST>жить-то можно без этого. не понимаю. почему некоторые это так близко к сердцу восприняли
А кто же кроме тебя это поймёт? Да и как-то невежливо было тебе советовать сходить к психоаналитику
VD>Кстати, почти уверен что для менеджед-классов этой фигни с виртуальными статическими методами сделать будет нельзя. В дотнете просто нет этого бреда.
Можно-можно. Delphi.NET генерирует вполне разумный IL.
Просто это не static virtual в понимании IL. Отдельный workaround, скрытые метаклассы и т.п.
По части workaround они в Delphi хорошо поработали. Я где-то полгода назад читал, что там наворотили. Очень прикольно, ловкачи просто.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, Serginio1, Вы писали:
S>> Абсолютно не согласен с такой постановкой. S>> Нужно брать все самое лучшее из различных языков. Благо Net этому благоприятствует. S>>А вот если не ждать а пользоваться ... S>>Но на вкус и цвет ...
VD>Одно не пойму, а нафиг тебе при этом Шарп.
Ну мне много надо. Честно говоря читая код на шарпе а затем на паскале не чувствуешь разницы как и писать. Но лучшее в этих языках хотелосьбы использовать. VD>Кстати, почти уверен что для менеджед-классов этой фигни с виртуальными статическими методами сделать будет нельзя. В дотнете просто нет этого бреда.
Ну насчет Бреда это ты погорячился. Бред в том, что в Net такого нет.
Борланд просто автоматом делает метаклассы http://www.rsdn.ru/Forum/Message.aspx?mid=548308&only=1
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, s.ts, Вы писали:
ST>>и опять во многом благодаря VladD2, который всех назвал дураками и таким образом решил поставленную задачу
AVK>А по моему прежде всего благодаря тебе. Ты так и не ответил нафига оно тебе нужно.
Обычно такое нужно когда гора классов наследников от одного базового класса.
Например Component или Control или иные случаи когда нужно единообразное создание экземпляров тип, однозначно что бы эти типы были наследниками от базового типа и несли специфическую информацию об этом типе. Конечно все это легко реализуется и через отображение, но это тормозно и нетипизировано.
Кстати Борланд с каждым классом ассоциирут и метакласс
function _GetMetaFromHandle(ATypeHandle: System.RuntimeTypeHandle): _TClass;
var
t, save: System.Type;
ancestor: _TClass;
ctorInfo: System.Reflection.ConstructorInfo;
begin
InitMetaTypeMap;
Result := _TClass(MetaTypeMap[ATypeHandle]);
if not Assigned(Result) then
begin
save := System.Type.GetTypeFromHandle(ATypeHandle);
t := save;
if not t.IsSubClassOf(TypeOf(_TClass)) then
begin
t := t.GetNestedType('@Meta' + t.name,
BindingFlags.Public or BindingFlags.NonPublic);
end;
if Assigned(t) then
Result := _TClass(t.GetField('@Instance').GetValue(nil))
else
begin// Requested type is not a Delphi class
t := save.BaseType;
if Assigned(t) then
begin// Is it a descendent of a Delphi class?
ancestor := _GetMetaFromHandle(t.TypeHandle);
t := System.Object(ancestor).GetType;
if t.IsSubClassOf(TypeOf(_TClass)) then
begin// yes! descendent of a Delphi class
ctorInfo := t.GetConstructor(System.Type.EmptyTypes);
if Assigned(ctorInfo) then
begin// construct an instance of the Delphi classref
// but set its instancetypehandle to this non-Delphi type
Result := _TClass(ctorInfo.Invoke(nil));
Result.SetInstanceType(ATypeHandle);
end;
end;
end;
if not Assigned(Result) then
Result := _TClass.Create(ATypeHandle);
end;
MetaTypeMap.Add(ATypeHandle, Result);
end;
end;
и солнце б утром не вставало, когда бы не было меня
iT>>1. Это банально неудобно. Сравни DataTypeClass.Name и выражение для вычисления атрибута. AVK>Да никакой такой большой разницы нет. Особенно если лезть не напрямую, а через TypeDescriptor.
Хорошо. Давай проверять.
Итак, задача: вытащить имя DataSet'а заданное для конкретного типа. У тебя есть ссылка на тип, SomeDataSetType, известно, что это подтип DataSet.
При наличии статических виртуальных членов это пишется так:
return SomeDataSetType.Name
Напиши, как ты это будешь делать на шарпе сейчас. Пусть там атрибутом это задано или как-то еще. Померим, где кода больше, где он проще и естественнее.
iT>>2. Атрибуты могут содержать только неизменяемую информацию. И гарантированно известную на этапе компиляции. AVK>Нет конечно. Это относится только к параметрам конструкторов.
Согласен. Но все равно это наклдывает очень существенные ограничения. Можно поме5нять содержимое атрибута какого-то типа в runtime?
AVK>Нет и еще раз нет. Это решения и ничего больше. По твои трем строчкам можно создать только очень близкое подобие, которое естественно будет кривым. Пытаться что то менять невозможно, поскольку это скорее всего приведет к изменению каких либо характеристик, а не зная исходной задачи понять допустимо ли это невозможно. iT>> Впрочем, текстом я их тоже формулировал. AVK>Что то не заметил. Заметил только решения с использованием Дельфи.
Хорошо, специально по заявке, формулирую задачи еще раз:
1. Обеспечить передачу в метод ссылки на тип, гарантированно являющийся подтипом заданного типа. Осуществить проверку как можно раньше и проще.
2. Известно, что есть тип DataSet и его подтипы. Каждый тип обладает некроторым статичным по отношению к своим экземплярам свойством — например, количеством таблиц. Имея ссылку на тип, являющийся подтипом DataSet, узнать число таблиц для жтого типа DataSet'а.
Если что-то непонятно в формулировке, я поясню. Я не буду пояснять, "какая задача в целом", "зачем это надо" и "зачем я вообще юзаю DataSet'ы, они must die".
AVK>Решения вроде статической дельфевой виртуальности, виртуальных конструкторов, published модификатора и т.п.
Не вижу связи published с остальным. Published — действительно некрасивая штука, специально для дизайнера и сериализации сделанная. Остальное — очень неплохо. Виртуальный конструктор (фактически, это виртуальный статический метод) — это вообще очень стройно, тип сразу является фабрикой.
AVK>В добавку? Тем что появилось бы две конструкции языка, решающие одну и ту же задачу. Это очень плохо.
Да ну? Давайте выкинем все управляющие конструкции, кроме while — его достаточно. Выкинем for, if, switch, foreach.. нафига надо?
iT>>Атрибуты — это мощно, как встроенный ассемблер Очень мощно. Но это более низкий уровень. AVK>Кастомные атрибуты более низкий уровень по сравнению с системой типов? Что то я совсем перестаю тебя понимать.
Конечно, более низкий. Типы — это уже предметная область. А атрибуты — жутко безлики. Я могу любой классовый атрибут прицепить к любому классу.
iT>> Код, написанный с массовым применением атрибутов некрасив, многословен, изобилует проверками того, чего не должно быть.
AVK>Вы просто не умеете их готовить.
Да, да, конечно
Ну напиши мне код, извлекающий из типа значение атрибута, как ты это умеешь. Сколько строк выйдет? Не меньше 5, как мне кажется. Ну, правда, можно сделать helper-класс. Так и делаем. Некрасиво, проверки, кастинг кругом, наконец, производительность от reflection.
iT>> Там может быть 10 методов. Воротить 10 атрибутов? AVK>Атрибуты вобще то можно еще и к классам применять. А если ума нет то можно еще к параметрам методов атрибуты прицепить, причем для каждого свой.
Я имел в виду 10 статических виртуальных методов Функциональность которыех ты предолагаешь реализовывать на атрибутах.
iT>>Кстати, еще бы не помешали интерфейсы типа.
AVK>Вот вот, начинается хардкодная городильня. А атрибуты уже вполне способны интерфейсы реализовывать без дополнительных наворотов и заточек.
Итерфейсы по-соглашению с поздними проверками. Давайте вернемся к IDispatch что-ли.
AVK>Ну коль такие аргументы пошли в ход тогда я тебя спрошу — почему ни в одном новом языке — будь то джава, шарп или vb.net нет статической виртуальности. Значит идея этой самой виртуальности оказалась неперспективной.
Я не знаток кучи языков, но, кажется в smalltalk это есть. Ну а докащзательство "в этих языках нету, значит неперспективно" считаю совершенно неубедительным
iT>> И вообще это нашей темы не касается. AVK>Касается, поскольку работает PG как раз на основе той самой информации, привязанной к конкретному типу. Красивое и очень мощное решение без необходимости прибегать к виртуальным статическим методам. AVK>Ты плохо себе представляешь что такое PG. Он способен понимать очень много кастомной информации.
Большей частью — обобщенной информации! Которая есть у ЛЮБОГО типа. А я же ратую за то, чтобы можно было получать спеифическую информацию о подтипах. Да, PG вовсю использует для этого атрибуты, где надо.
iT>> Кстати, в Delphi можно было написать редактор свойства для уже существующего типа AVK>Что смешного? В PG тоже можно.
Да ну? Не знал И как написать свой редактор для DockStyle стандартных компонент? А то мне не нравится стандартный. Впрочем, это опять уход от темы.
AVK>И это все что там можно сделать. А локализация? А состав свойств? А динамические свойства? А менять названия/видимость/редактор/все-что=хочешь у свойств на лету? Налицо значительное преимущество атрибутной модели дотнета над дельфовой.
Просто PG новее и там решили сделать бюольше возможностей. Попробуй докажи, что без атрибутов на Delphi это не могли сделать тогда. Просто не ставили такиую задачу. И то было — чудо.
iT>>Я вовсе не отрицаю пользу атрибутов. И Абсолютно согласен, что [Browsable] — это качественно лучшее решение, нежели published. AVK>Ну так с виртуальной статикой тоже самое. Атрибуты гибче, универсальнее и не завязаны на систему типов.
Не то же самое. Иногда гибче. Иногда нет. То, что не завязаны — иногда плюс, иногда — минус.
iT>>А иногда жесткость — это имеенно то, что нужно. Что — не согласен? AVK>Нет, потому что просто жесткость никому не нужна. Нужна управляемая жесткость. Дженерики позволяют жесткостью ограничений хоть как то управлять и не коррелировать с деревом наследования.
Там уравляемая жесткость Слова-то какие, блин
Насчет дерева наследования — да, согласен. Поэтому хотелось бы статических интерфейсов
iT>>еще потому, что там есть статические виртуальные члены AVK>Мне это напоминает убежденность Мики в том что сессии веб-сервисов это преимущество сервисов перед ремоутингом.
А мне твоя уверенность в ненужности статических виртуальных членов потому что есть атрибуты напоминает то же самое. К чему бы это?
iT>>Как это делать на C#? Ну, как водится — атрибут, содержащий тип, который реализует интерфейс проверки. iT>>Вот это я и называю — через задницу AVK>Кому как. По мне так через задницу как раз первый вариант, поскольку если помимо TField мне понадобится такая же проверка в каком нибудь TProperty или TColumn я буду ее писать по новой. А если мне понадобится еще и перекрыть проверку у конкретного свойства типа TField то ситуация становится еще более фиговой.
Отчасти соглашусь. Но первый вариант жестче (иногда это надо), красивее, короче, производительнее.
AVK>>>Если бы они додумали мысль до конца я думаю они бы пришли к более гибкому решению. А так получился просто хак языка и рантайма под конкретную задачу.
iT>>А я скажу так — очень хорошая, полностью осмысленная, стройная языковая конструкция, чрезвычайно нужная при создании высокодинамичных систем. Криво, но эмулируемая с помощью атрибутов. AVK>Во! О чем я и говорю. Вместо того чтобы решать задачи вы эмулируете то что есть в Дельфи.
И не только "мы". Ну попробуй решить, не эмулируя атрибутами. Кстати, если подойти логически, то TypeDescriptorAttribute — это самый настоящий статический интерфейс. Он эмулируется атрибутом.
iT>> Потому что ими все можно эмулировать, что имеет отношение к типам. AVK>Не, не эмулировать. Это их предназначение — расширять информацию о типе. Точно так же можно сказать что статическая виртуальность эмулирует один из аспектов применения атрибутов.
Вспоминаем Вильгельма Оккама. Типы и экземпляры у нас уже есть, свойства типов уже есть. Атрибуты — это новая концепция, а статические свойства типов (в т.ч. виртуальные) — следствие старых сущностей.
iT>> Ими можно виртуальные методы эмулировать. легко! Давайте выкинем ключевые слова virtual, abstract, override и будем это делать с помощью атрибутов. Гибко! Ортогонально! iT>>Почему имя типа — не атрибут? Почему предок типа — не атрибут?
AVK>Потому что эти данные необходимы рантайму (не языку заметь, и не среде разработки).
А в языке должно быть не то, что необходимо или нет рантайму (сам же published ругал), а то, что необходимо программисту и предметной модели!
Здравствуйте, mihailik, Вы писали:
ST>>>впрочем, это все равно будет такой изврат. что проще обойтись без...
ST>>жить-то можно без этого. не понимаю. почему некоторые это так близко к сердцу восприняли
M>А кто же кроме тебя это поймёт? Да и как-то невежливо было тебе советовать сходить к психоаналитику
AVK>Я тебе скажу почему. Потому что в Дельфи нет рефлекшена.
Ну батенька у Вас сильно устаревшая информация. Сейчас разговор о Delphi 8. iT>> Вот разработчикам VCL это все-таки почему-то нужно было
iT>> Ну, да, "не такие". Потому что на C# не решаются по-человечески.
AVK>Попытка слепо скопировать решения с одной платформы на другую никогда хорошо не кончались.
А что плохого в том, что для каждого типа автоматом генерится Meta класс. И чем плохим это может закончится????
и солнце б утром не вставало, когда бы не было меня
не поняля откуда имеется информация о DoSame, если DoSame генерится в рантайме ?
или речь идет о рисовании интерфейса для каждого класса вручную ?
ST>>p.s. ST>>кстати, можно будет в дотнете 1.2 создавать шаблоны для интерфейсов ? (это я о дженериках)
M>Например IList<T>, это тебя интересует? Есть такое дело.
Здравствуйте, mihailik, Вы писали:
ST>>да уж то еще г...
M>А чего в кондуктора не пошёл? Родителей расстроить боишься? Ездил бы себе весь день по маршруту и никаких Микрософтовских инсинуаций не боялся.
?
что с тобой ?
M>Ты же знаешь, сейчас за деньги можно многое купить. Накопи денег, люди тебе C#-компилятор за милую душу перепишут. Я например, по бедности своей хохляцкой, всего за три штуки баксов встроил бы прямо в C# этот многострадальный static virtual. Чики-пуки, даже без суррогатностей.
вообще-то уже встроено в дельфи, но там другого нету
M>Всего 3000 долларов за счастье, это же так мало!
эк тебе приходится изголяться чтоб "три штуки баксаф палучить"
а мое счастие не в этом — не в staic virtual и уж тем более не в 3000 долларов
Здравствуйте, mihailik, Вы писали:
iT>>Ротор соотв. образом дописать — лично у меня ума не хватит.
M>А денег? За 500 баксов я бы сделал суррогатную статическую виртуальность для C#. Надо?
ого
пора прайс формировать:
суррогатная статическая виртуальность — 500 баксов
статическая виртуальность на уровне компиляторов — 3000 баксов
Здравствуйте, mihailik, Вы писали:
ST>>MSIL от борланд может и не работать...
ST>>уже рука моя колоть устала
M>Правильно тебе Влад советует. Забей. Оно тебе надо колоть?
наверное, нет.
просто я каждый день борюсь с ...
удовольствия мало
ST>>>>впрочем, это все равно будет такой изврат. что проще обойтись без...
ST>>>жить-то можно без этого. не понимаю. почему некоторые это так близко к сердцу восприняли
M>>А кто же кроме тебя это поймёт? Да и как-то невежливо было тебе советовать сходить к психоаналитику
ST>в смысле ?
А чего ты ругаешься? Не нравится — не ешь, зачем же стулья ломать?
ST>вообще-то уже встроено в дельфи, но там другого нету
А скопишь деньжат, тебе и в C# встроено будет.
M>>Всего 3000 долларов за счастье, это же так мало!
ST>эк тебе приходится изголяться чтоб "три штуки баксаф палучить"
Открою секрет. Я за штуку лицензию на R# куплю и доделаю эту фичу. Коммерческий подход, понимаешь
ST>а мое счастие не в этом — не в staic virtual
Здравствуйте, Igor Trofimov, Вы писали:
iT>Ну что, будем решать задачки?
Неа, не хочу тратить время. Примеры решения подобных задач можешь посмотреть в PG и компонентной модели в целом. Что же касается остального то нет времени заниматься флеймом с использованием демагогии. Последнее твое сообщение это уже повторение того же самого. Все мои возражения остаются прежними.
Здравствуйте, Serginio1, Вы писали:
AVK>>Я тебе скажу почему. Потому что в Дельфи нет рефлекшена. S> Ну батенька у Вас сильно устаревшая информация. Сейчас разговор о Delphi 8.
Не батенька, вы просто не следите за базаром. Речь шла о использовании статических методов в VCL. При чем тут Дельфи 8?
AVK>>Попытка слепо скопировать решения с одной платформы на другую никогда хорошо не кончались. S> А что плохого в том, что для каждого типа автоматом генерится Meta класс.
А что хорошего? Дельфи 8 без этого не обойтись, им совместимость нужна. Соображения производительности неинтересны, поскольку сущностей мало (вряд ли у тебя в программе будет больше сотни классов, обрабатывающихся каким то спец. алгоритмом) и в ходе работы они не меняются (а значит можно эффективно кешировать). Что же касается типобезопасности то тут вы просто никак не хотите оторваться от Дельфевой модели и пытаетесь ее эмулировать. Следует же просто понять что в дотнете дополнительная метаинформация ортогональна основной, а в Дельфи она непосредственно на нее повязана. Лучше или хуже то или другое решение это отдельный вопрос, главное понять что она другая и слепо копировать не стоит.
S>Бред в том, что в Net такого нет. S>Борланд просто автоматом делает метаклассы
Ну да, а крупный рогатый скот автоматом классные лепёшки производит. Потом что хочешь делай — хочешь огород удобряй, хочешь — подсуши и в рамку вставь. Классная фича, могли бы и в C# встроить!
S> И работать с ними намного удобнее и быстрее чем с активаторами и прочей лабудой отображения.
Здравствуйте, mihailik, Вы писали:
S>>Бред в том, что в Net такого нет. S>>Борланд просто автоматом делает метаклассы
M>Ну да, а крупный рогатый скот автоматом классные лепёшки производит. Потом что хочешь делай — хочешь огород удобряй, хочешь — подсуши и в рамку вставь. Классная фича, могли бы и в C# встроить!
Лепешки это вещь классная. Но наследники от Type не возможны для ручного дополнения. А в чем проблема???
S>> И работать с ними намного удобнее и быстрее чем с активаторами и прочей лабудой отображения.
M>Да в сотни раз
А то и больше.
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, mihailik, Вы писали:
S>>когда нужно единообразное создание экземпляров
M>И что, в дотнете нет готового решения?
Решить можно все и не обязательно на до нете. Но так как Type не расширяем, то дельфевые метаклассы этим как раз и занимаются. Плохо это или хорошо решать каждому индивидуму.
и солнце б утром не вставало, когда бы не было меня
[Skipped]
M>На последней Kiev .NET User Group один товарищ защищал VB и заодно и Кобол. Выглядело смешно, но у всех были такие умные лица, что я постеснялся гоготать
Тогда надо было флейм развести. На тему всеобщего равенства и братства языков программирования, принесенную в нашу жизнь дотнетом.
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, Serginio1, Вы писали:
AVK>>>Я тебе скажу почему. Потому что в Дельфи нет рефлекшена. S>> Ну батенька у Вас сильно устаревшая информация. Сейчас разговор о Delphi 8.
AVK>Не батенька, вы просто не следите за базаром. Речь шла о использовании статических методов в VCL. При чем тут Дельфи 8?
Вообщето разговор шел static virtual вообще.
AVK>>>Попытка слепо скопировать решения с одной платформы на другую никогда хорошо не кончались. S>> А что плохого в том, что для каждого типа автоматом генерится Meta класс.
AVK>
AVK> А что хорошего? Дельфи 8 без этого не обойтись, им совместимость нужна. Соображения производительности неинтересны, поскольку сущностей мало (вряд ли у тебя в программе будет больше сотни классов, обрабатывающихся каким то спец. алгоритмом) и в ходе работы они не меняются (а значит можно эффективно кешировать). Что же касается типобезопасности то тут вы просто никак не хотите оторваться от Дельфевой модели и пытаетесь ее эмулировать. Следует же просто понять что в дотнете дополнительная метаинформация ортогональна основной, а в Дельфи она непосредственно на нее повязана. Лучше или хуже то или другое решение это отдельный вопрос, главное понять что она другая и слепо копировать не стоит.
У меня есть и по 400 и больше. Пример 1С и автоматически генерящихся исходников по мегабайтам, и неопределенные типы полей и тд. Мне как раз это очень нужно и активно используется.
А то что дельфевые метаклассы расширяют Type ничего плохого в этом не вижу. А насчет копирования, не совсем это копирование а расширение возможностей типа. Вот и все.
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, mihailik, Вы писали:
ST>>эк тебе приходится изголяться чтоб "три штуки баксаф палучить"
M>Открою секрет. Я за штуку лицензию на R# куплю и доделаю эту фичу. Коммерческий подход, понимаешь
извини, недооценил
ST>>а мое счастие не в этом — не в staic virtual
M>Так об этом тебе, между прочим, люди и толкуют.
здОрово
еще оно [счастие] не в рефлекшене и не в атрибутах
а, видимо, в том, чтобы решать свои задачи адекватными для выбранной платформы (в т.ч. языковой) методами и платформы правильно для своих задач выбирать
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, s.ts, Вы писали:
ST>>наверное, нет. ST>>просто я каждый день борюсь с ... ST>>удовольствия мало
AVK>Вот и рассказывай с чем ты борешься, а не как предполагаешь что это можно побороть.
— она не работает. там Qt обернули своими классами и ерунда получилась. фразой "MSIL от борланд может не работать" я высказал предположение, что когда борланд обернет дотнет своими приблудами, то это может опять не работать (в буквальном смысле).
Здравствуйте, Serginio1, Вы писали:
AVK>>Не батенька, вы просто не следите за базаром. Речь шла о использовании статических методов в VCL. При чем тут Дельфи 8? S> Вообщето разговор шел static virtual вообще.
Вобще то процитированная тобой фраза была конкретным ответом на конкретный вопрос. Тебе процитировать диалог или сам найдешь?
S> У меня есть и по 400 и больше.
S>> У меня есть и по 400 и больше.
AVK>Это все мелочь.
Но создавать и уничтожать их приходтся очень много. Это касается когда поле объекта неопределенного типа (но наследик базового). И на рефлексии это сажается махом. Конечно можно предусмотреть фабрику классов автоматически её городить. Но зачем если есть метаклассы
а в Native виртуальные конструкторы. Не знаю почему вы все так против метаклассов, но это действительно удобно.
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Serginio1, Вы писали:
AVK>>Это все мелочь. S> Но создавать и уничтожать их приходтся очень много.
А метаклассы типа не надо создавать что ли?
S> Это касается когда поле объекта неопределенного типа (но наследик базового). И на рефлексии это сажается махом.
Да нечего там сажать на рефлексии, копейки это. Рефлексия страшна на экземплярах, коих может быть масса.
S>Не знаю почему вы все так против метаклассов, но это действительно удобно.
Не на столько удобно чтобы серьезно менять ради этого язык.
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, Serginio1, Вы писали:
AVK>>>Это все мелочь. S>> Но создавать и уничтожать их приходтся очень много.
AVK>А метаклассы типа не надо создавать что ли?
Метаклассы создаются автоматически в конструкторе типа 1 раз. А вот объекты S>> Это касается когда поле объекта неопределенного типа (но наследик базового). И на рефлексии это сажается махом.
AVK>Да нечего там сажать на рефлексии, копейки это. Рефлексия страшна на экземплярах, коих может быть масса.
10000 20000 тысяч документов по 100 строк в документеа то и более, 2-5 полей итого .... На рефлексию уйдет больше чем на все остальное. Это только конструкторы, а есть и виртуальные статические методы. Я уже говорил meta слассы это скорость типизация и удобство. Type это хорошо но мало.
Я не говорю уже о бухгалтерии. Значит в 1С все отлично???
S>>Не знаю почему вы все так против метаклассов, но это действительно удобно.
AVK>Не на столько удобно чтобы серьезно менять ради этого язык.
А метаклассы фича не языка, а компилятора. Оно пока есть в Delphi и это фича может использоваться и в других языках. Ни чего и менять не надо. И во многих случаях действительно очень удобно.
Интересно а когда M$ создаст другой язык (тоже надеюсь тоже его изучить), более приспособленный дря решения определенных задач и у него будут специализированные фичи, то тоже флейм начнется по ненужности их????
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Serginio1, Вы писали:
AVK>>А метаклассы типа не надо создавать что ли?
S> Метаклассы создаются автоматически в конструкторе типа 1 раз. А вот объекты
А их тебе никто не мешает также создавать в статическом конструкторе 1 раз.
AVK>>Да нечего там сажать на рефлексии, копейки это. Рефлексия страшна на экземплярах, коих может быть масса. S> 10000 20000 тысяч документов по 100 строк в документеа то и более, 2-5 полей итого ....
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, Serginio1, Вы писали:
AVK>>>А метаклассы типа не надо создавать что ли?
S>> Метаклассы создаются автоматически в конструкторе типа 1 раз. А вот объекты
AVK>А их тебе никто не мешает также создавать в статическом конструкторе 1 раз.
AVK>>>Да нечего там сажать на рефлексии, копейки это. Рефлексия страшна на экземплярах, коих может быть масса. S>> 10000 20000 тысяч документов по 100 строк в документеа то и более, 2-5 полей итого ....
AVK>Ты как будто не читаешь о чем я тебе пишу.
Масса это сколько 10 миллионов мало??? 2-5 полей неопределенного типа.
Постараюсь еще раз объяснить. Есть БД в котороой больше сотни документов справочников и регистров итд.
Есть поля неопределенного тип имеющий вид IdType и ID. По IDType вызываем конструктор , по ID находим сам объет (вернее записываем его данные). Это легко решается создав хэштаблицу
IdType,@MetaClass. Иначе мне пришлосьбы либо через рефлексию городить
IdType,Type и уже из Type по рефлексии вызывать конструктор, либо создав типизированные делегаты вызывающие конструкторы
IDType, TypeDelegate
. Но при этом теряю информацию о типе до создания объекта.
Еще вариант создать функцию со Switch и по IdType вызывать нужный конструктор. Все решается, но зачем это городить когда есть метаклассы. Самый удобный вариант.
Не говоря уже о расширении информации о типе. И зачем мне ручками делать если метаклассы автоматически генерятся????
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, Serginio1, Вы писали:
AVK>>>Ты как будто не читаешь о чем я тебе пишу. S>> Масса это сколько 10 миллионов мало???
AVK>10 миллионов классов?
10 миилионов не классов а создание экземпляров классов. Конечно можно кэшировать не удаляя, а повторно использовать уже созданные, но там тоже возникают проблемы с освобождение подчиненных объектов. Легче создать и удалить. Да иногда и хранить тоже нужно.
Наглядный пример проводка в бухгалтерии, где для каждого счета свой набор субконто.
А проводок этих ....
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, Serginio1, Вы писали:
AVK>>>10 миллионов классов? S>> 10 миилионов не классов а создание экземпляров классов.
AVK>И какое отношение статические методы или атрибуты имеют к количеству экземпляров?
Вызов конструкторов, дополнительная информация о классах. S>> Конечно можно кэшировать не удаляя,
AVK>Не можно, а нужно.
Так и делается только с ограничением на количество экземпляров класса . S>> а повторно использовать уже созданные, но там тоже возникают проблемы с освобождение подчиненных объектов.
AVK>Какие?
Например есть объект, у него поле со ссылкой на другой объект. Иногда приходится делать поиск.
Док.Клиен.Договор.Счет и еще можно привести кучу примеров. Но теперь у следующего клиента эти поля не нужны клиента не нужны. S>> Легче создать и удалить.
AVK>Это при 10 то миллионах вызовов и 400 классах? Ну ну.
Смех смехом А вот разницы как раз и нет. Создание происходит очень быстро и 10 мил это пшик. Во Во. Но кончно же кэширутся, но все равно в таблицу так или иначе лезть надо как за кэшируемыми объектами так и для нового их создания.
И метаклассы предоставляют огромное удобство.
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Serginio1, Вы писали:
AVK>>И какое отношение статические методы или атрибуты имеют к количеству экземпляров?
S> Вызов конструкторов, дополнительная информация о классах.
И что вызов конструкторов?
AVK>>Не можно, а нужно. S> Так и делается только с ограничением на количество экземпляров класса .
При чем тут количество экземпляров?
S>>> а повторно использовать уже созданные, но там тоже возникают проблемы с освобождение подчиненных объектов.
AVK>>Какие? S> Например есть объект, у него поле со ссылкой на другой объект. Иногда приходится делать поиск. S> Док.Клиен.Договор.Счет и еще можно привести кучу примеров. Но теперь у следующего клиента эти поля не нужны клиента не нужны.
Ну и какое это имеет отношение к кешу метаданных?
S>>> Легче создать и удалить.
AVK>>Это при 10 то миллионах вызовов и 400 классах? Ну ну. S> Смех смехом А вот разницы как раз и нет. Создание происходит очень быстро и 10 мил это пшик. Во Во. Но кончно же кэширутся,
Что кешируется? Что создается? Ты опять о чем то о своем.
AVK>Что кешируется? Что создается? Ты опять о чем то о своем.
Ну не совсем, я об этом уже сколько толкую.
Пример, есть документ у которого есть поле неопределенного типа Субкото, по Ид типа я должен создать экземпляр класса и просчитать, в следующей записи документа Субконто имеет другой тип.
Старое значение субконто записывается в таблицу с ассоциированным с типом кэшем экземпляров типа или уничтожается. Итак далее. Но данный пример только с одним документом, на самом деле этих документов может быть много. Вся беда с неопределенными типами.
И нужно вызывать конструкторы и брать из кэша.
Мета классы позволяют легко создавать объекты данного типа и создавать и получать статическую информацию для данного типа.
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Igor Trofimov, Вы писали:
iT>1. Передача типа — потомка заданного типа iT>
iT>type TControlClass = class of TControl;
iT>procedure AddControl(ControlClass : TControlClass);
iT>
iT>2. Извлечение информации о типе, специфичной для всех типов — подтипов заданного iT>
iT>// Базовый тип
iT>type DataSet = class(Component)
iT> ...
iT> // Виртуальный член типа
iT> class function GetDataSetName : string; virtual;
iT> ...
iT>end;
iT>// Ссылка на тип, производный от базового
iT>TDataSetClass = class of TDataSet;
iT>...
iT>// Переменная ссылки на такой тип
iT>var DataSetClass : TDataSetClass;
iT>....
iT>// Извлечение информации о конкретном типе
iT>ShowMessage(DataSetClass.GetDataSetName);
iT>
Привыкли все делать одним путем напоминающим русское достижение в области удалния кланд и считаете что других путей нет:
Type type = dataSetCastToObject.GetType();
Console.WriteLine(type.Name);
... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, AndrewVK, Вы писали:
AVK>Нет конечно, ничего такого он не подразумевал. Просто когда говорят что что то нужно, потому что очень хочется, никак не обосновывая то естественно возникает вопрос — нафига?
Вот именно.
iT>>Итак, я привел тебе два конкретных примера,
AVK>Какие то они некудышние.
Ага. Эмуляция GetType .
... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Igor Trofimov, Вы писали:
iT>Ну, может, я плохо сформулировал, но, надеюсь, сама проблема понятна?
Не. В том то и дело. Что ну в упор не вижу поблему.
С помощью этих фич ты решаешь две проблемы: 1. Получение информации о типе в рантайме. Это в дотнете делает метод GetType, причем не от илюзорного класса, а от любокго объекта ссылку на который можно получить. 2. Динамическое создание экземпляра объекта. Это решается Activator-ом.
Так что проблема просто в том, что вам похоже просто хочется, что бы было как в Дельфи.
Ято же касается рассуждений о других языках... то приведите хоть один кроме дельфи где были бы виртуальные метода не-инстанс-методы.
... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
VD>Привыкли все делать одним путем напоминающим русское достижение в области удалния кланд и считаете что других путей нет: VD>
VD>Type type = dataSetCastToObject.GetType();
VD>Console.WriteLine(type.Name);
VD>
VD>
Да суть то в том, что хочется этот Type расширить, а кроме как метаклассов не получится.
Тебе хватает type.Name, а кому то нужно несколько другое представление и отображение.
Вопрос тебе Type на все случаи жизни хватает?????
и солнце б утром не вставало, когда бы не было меня
VD>Type type = dataSetCastToObject.GetType();
VD>Console.WriteLine(type.Name);
VD>
VD>
Кроме того сам Type это метакласс но не расширяемый.
Предлагают ассоциированный с этим типом расширяющий его метакласс, не нравится.
Вот и пойми , что человеку нужно.
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Serginio1, Вы писали:
S>Здравствуйте, VladD2, Вы писали: VD>>
VD>>Type type = dataSetCastToObject.GetType();
VD>>Console.WriteLine(type.Name);
VD>>
VD>> S> Кроме того сам Type это метакласс но не расширяемый. S>Предлагают ассоциированный с этим типом расширяющий его метакласс, не нравится. S>Вот и пойми , что человеку нужно.
Кроме того организован он как в Delphi ссылка в VMT с отрицательным смещением(по поводу C++ был спор и ответ получил что не определено)
и по сути все его методы можно считать статическими виртуальными.
Метаклассы несут ту же нагрузку только расширяемы.
и солнце б утром не вставало, когда бы не было меня
ST>а, видимо, в том, чтобы решать свои задачи адекватными для выбранной платформы (в т.ч. языковой) методами и платформы правильно для своих задач выбирать
Здравствуйте, mihailik, Вы писали:
M>>>И что, в дотнете нет готового решения? S>> Решить можно все и не обязательно на до нете.
M>Это угроза?
S>>Но так как Type не расширяем, то дельфевые метаклассы этим как раз и занимаются. Плохо это или хорошо решать каждому индивидуму.
M>Ладно. Каждому так каждому. Но если есть готовое средство, делать "дельфёвые метаклассы" по меньшей мере экстравагантно.
Почему экстравогантно. Delphi 8 сама их делает. Но нет готового средства.
Вот объясни мне дураку, чем расширение Type экстравагантно????
А ведь Type тот же метакласс.
и солнце б утром не вставало, когда бы не было меня
M>>Ладно. Каждому так каждому. Но если есть готовое средство, делать "дельфёвые метаклассы" по меньшей мере экстравагантно.
S>Вот объясни мне дураку, чем расширение Type экстравагантно????
Ну потому, что и так всё путём. Как говорится, зачем платить больше?
P.S. Не, ну если в Дельфи есть — хорошо. А к C# прикручивать это фанатизм чистой воды. Такое нужно наказывать рублём
Здравствуйте, mihailik, Вы писали:
M>>>Ладно. Каждому так каждому. Но если есть готовое средство, делать "дельфёвые метаклассы" по меньшей мере экстравагантно.
S>>Вот объясни мне дураку, чем расширение Type экстравагантно????
M>Ну потому, что и так всё путём. Как говорится, зачем платить больше?
M>P.S. Не, ну если в Дельфи есть — хорошо. А к C# прикручивать это фанатизм чистой воды. Такое нужно наказывать рублём
Да ради бога, если так рассуждать мне тоже много не нужно. И зачем только насоздавали не нужного кода???
И уж если говорить об ООП, нужно это или не нужно не важно, то почему Type нельзя расширять??? Чем он отличается от любого класса????
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Serginio1, Вы писали:
S> Да суть то в том, что хочется этот Type расширить, а кроме как метаклассов не получится.
Фигню не гвори. Это же не макросы. Создавай код (хоть эмитом) и расширяй на здоровье.
S> Тебе хватает type.Name, а кому то нужно несколько другое представление и отображение.
Впримере было получение имени. Вам уже тут не раз говорилось — говорите не как делать, а что делать. Тогда и ответ будет более конструктивный. С помощью рефлекшона можно вынуть любую информацию о типе. Ну, разве что до кода добраться не выйдет.
S> Вопрос тебе Type на все случаи жизни хватает?????
Ну, водку и баб не заменяет конечно...
... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Serginio1, Вы писали:
S> Кроме того организован он как в Delphi ссылка в VMT с отрицательным смещением(по поводу C++ был спор и ответ получил что не определено) S>и по сути все его методы можно считать статическими виртуальными. S>Метаклассы несут ту же нагрузку только расширяемы.
Очень советую не говорить о том, о чем имешь поверхностное представление. Если действительно интересно как устроена рантайм-информация о типах в дотнет ищи в гугле по словам metod table, fjit.
... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, mihailik, Вы писали:
M>Можно-можно. Delphi.NET генерирует вполне разумный IL.
Не ясно зачем, ну да...
M>Просто это не static virtual в понимании IL. Отдельный workaround, скрытые метаклассы и т.п.
Вот видишь. Я же говорю, что этог бреда там не будет.
M>По части workaround они в Delphi хорошо поработали. Я где-то полгода назад читал, что там наворотили. Очень прикольно, ловкачи просто.
Хакреы. Ну, да их понять можно. Все это для совместимости с кодом написанным под старые версии дельфи. Со временем уйдет в небытие.
M>Жаль, что это теперь мало кому нужно.
Почему жаль?
... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, mihailik, Вы писали:
M>Ну, это я поясняю, что товарищу хочется. Мне после Дельфи это хорошо понятно
Дык везде свои подходы. Используя одну технологию после другой нужно четко понимать что в ней и как, а не пытаться переложить под кальку старые подходы.
Если вместо создания стройной концепции МС свалил бы в новую технологию все подходы считающиеся удобными в дугих (Дельфи, С++, Ява, ...), то получился бы винигрет от которого только лишь тошнило бы.
... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, mihailik, Вы писали:
M>Виртуальные статические методы в Delphi.NET присуствуют, это факт. Они, конечно, видны не как статические методы с точки зрения C#. В общем, польза от них возможна только не выходя из Дельфи.
Т.е. они не виртуальные или не статические. То-то и оно.
... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
— она не работает. там Qt обернули своими классами и ерунда получилась. фразой "MSIL от борланд может не работать" я высказал предположение, что когда борланд обернет дотнет своими приблудами, то это может опять не работать (в буквальном смысле).
Открою тебе один сикрет... КуТи не работает сама по себе. Борлондовцы просто не знализ, что эту либу до ума напильниками нужно доводить. Вот и глючат их обпртки.
... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Serginio1, Вы писали:
M>>И что, в дотнете нет готового решения? S> Решить можно все и не обязательно на до нете. Но так как Type не расширяем, то дельфевые метаклассы этим как раз и занимаются. Плохо это или хорошо решать каждому индивидуму.
Про патерн (будь они не ладны) визитор слышал? Вот как раз позволяет делать вируальность налево. Может это решит проблемы дельфистов?
... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
VD>Не. В том то и дело. Что ну в упор не вижу поблему.
В решении указанных задачек. AVK уже отказался.
VD>С помощью этих фич ты решаешь две проблемы: 1. Получение информации о типе в рантайме. Это в дотнете делает метод GetType, причем не от илюзорного класса, а от любокго объекта ссылку на который можно получить.
Читаем выше. Информация, возвращаемая GetType слишком общая. И я хочу получать информацию о типе от ссылки на тип, а не от экземпляра.
VD>2. Динамическое создание экземпляра объекта. Это решается Activator-ом.
Ни слова не было про то, что нужно создавать эзкемпляр. Задачки не про это.
Здравствуйте, Serginio1, Вы писали:
S> Пример, есть документ у которого есть поле неопределенного типа Субкото, по Ид типа я должен создать экземпляр класса и просчитать, в следующей записи документа Субконто имеет другой тип. S>Старое значение субконто записывается в таблицу с ассоциированным с типом кэшем экземпляров типа или уничтожается.
Зачем уничтожать? Учитывая количество типов субконто и неизменность их состава в процессе работы программы спокойно можно ничего не удалять.
S> Итак далее. Но данный пример только с одним документом, на самом деле этих документов может быть много. Вся беда с неопределенными типами.
Пока не вижу никакой беды.
S> Мета классы позволяют легко создавать объекты данного типа
Чем это легче Type.CreateInstance?
S> и создавать и получать статическую информацию для данного типа.
Уже говорилось о том что атрибуты способны делать тоже самое. Да, несколько больше кода, зато значительно выше гибкость и простота использования для конечного программиста.
— она не работает. там Qt обернули своими классами и ерунда получилась. фразой "MSIL от борланд может не работать" я высказал предположение, что когда борланд обернет дотнет своими приблудами, то это может опять не работать (в буквальном смысле).
VD>Открою тебе один сикрет... КуТи не работает сама по себе. Борлондовцы просто не знализ, что эту либу до ума напильниками нужно доводить. Вот и глючат их обпртки.
там основные проблемы с синхронизацией Qt-шных объектов с их борландовскими обертками. (т.е. объект qt имеет одно состояние, а борландовский рапортует совсем о другом).
при том еще часть объектов борландовские, а часть — кутэшные.
второе — то, что qt за уши притянули к борландовской модели и до конца это нормально не сделали. в результате получается, что общаться толком с объектами можно толко посылкой сообщений (тогда кликсовые объекты лучше отрабатывают изменения через хуки), но это не согласуется с тем, как работают db-aware контролы от борланд.
третье — элементарная халатность: в комбобоксе в одном месте забыли единицу вычесть в результате не выбрать 1-й элемент выпадающего списка; TAlignment.Assign — опечатка в результате которой он не работает правильно; что-то еще было, уже не помню, сейчас уже все нужные классы своими обернуты. но этого, как мне кажется, уже достаточно для коммерческой библиотеки, продаваемой уже не первый год
это если интересует то, как все на самом деле.
по поводу qt особо плохого ничего не слышал. да и в KDE особых глюков не замечал.
Здравствуйте, mihailik, Вы писали:
M>P.S. Не, ну если в Дельфи есть — хорошо. А к C# прикручивать это фанатизм чистой воды. Такое нужно наказывать рублём
э-э-э-э, да ты тоже, я погляжу, на рубль ориентирован
iT>Никто не собирается ничего "эмулировать". Задачи, которые я приводил — вытекают не из возможностей Delphi или другого языка, где это есть, а из самой парадигмы ООП. И именно с отсутствующими возможностями они решались бы оптимальным способом, а не через задницу, как это приходится делать сейчас.
iT>Языки можно сравнивать, если они работают в некоторой общей парадигме (имхо, поэтому C# и Perl несравнимы, а C#, Delphi, Java — сравнимы).
Интересно, а кто тебе сказал, что Delphi поддерживает парадигму ООП? Или С++? Они в конце-концов реализовали её в шарпе, а Delphi и C++ — это просто языки, в которых есть такой тип данных — объект. И называть их за это объектно-ориентированными.... Ну вы, блин, даёте....
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, Serginio1, Вы писали:
VD>Про патерн (будь они не ладны) визитор слышал? Вот как раз позволяет делать вируальность налево. Может это решит проблемы дельфистов?
визитор работает с инстанциями и не накладывает ограничений на отношения объектов (имеется ввиду контроль того, что объекты из одной ветки иерархии классов).
мне это все больше напоминает абстрактную фабрику.
кстати, вопрос о виртуальном конструкторе не ввергает всех в шок?
а ведь он [конструктор] тоже в некотором смысле статический метод.
p.s. вопрос тут более абстрактен, чем дельфи vs... также долго можно спорить о том, как должны виртуальные функции из конструктора вызываться или о чем-то другом и это уже не будет delphi vs...
на всякий случай повторюсь, что меня интересовала возможность реализации схожей функциональности в дотнете, а не споры о "нужно/не нужно"
Здравствуйте, VladD2, Вы писали:
VD>Ято же касается рассуждений о других языках... то приведите хоть один кроме дельфи где были бы виртуальные метода не-инстанс-методы.
Здравствуйте, mihailik, Вы писали:
S>>И уж если говорить об ООП, нужно это или не нужно не важно, то почему Type нельзя расширять??? Чем он отличается от любого класса????
M>Ты что, вообще против значка sealed? Это же основы!
public abstract class Type : MemberInfo, _Type, IReflect
Не вижу sealed. Причем так все его виртуальные методы так или иначе перекрываются в наследниках но компилятором.
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, mihailik, Вы писали:
S>> Мета классы позволяют легко создавать объекты данного типа и создавать и получать статическую информацию для данного типа.
M>Что такое "данный тип"? Ты хранишь в БД название типа?
M>Если название, то задача перерождается в получение статической информации по названию типа.
Дельфевые мета слассы ассоциируются с типом, и расширяют его функционал. Единственно, что пока не нашел как создать class var virtual — виртуальные переменные класса, что лего сделать если внелрить их в мета класс
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, Serginio1, Вы писали:
S>> Пример, есть документ у которого есть поле неопределенного типа Субкото, по Ид типа я должен создать экземпляр класса и просчитать, в следующей записи документа Субконто имеет другой тип. S>>Старое значение субконто записывается в таблицу с ассоциированным с типом кэшем экземпляров типа или уничтожается.
AVK>Зачем уничтожать? Учитывая количество типов субконто и неизменность их состава в процессе работы программы спокойно можно ничего не удалять.
А смысл его держать. По затратам получается как физическим так и скорости выполнения программы, что новый объект создать проще.
S>> Мета классы позволяют легко создавать объекты данного типа
AVK>Чем это легче Type.CreateInstance?
Типизированный вызов конструктора и его скорость. S>> и создавать и получать статическую информацию для данного типа.
AVK>Уже говорилось о том что атрибуты способны делать тоже самое. Да, несколько больше кода, зато значительно выше гибкость и простота использования для конечного программиста.
Атрибуты вещь хорошая, но во первых когда я конструирую класс и работа только с наследниками данного класса. Зачем нужны атрибуты. Атрибуты тоже играют роль метаклассов. И так или иначе мы крутимся вокруг них. Мало того мне не хватает еще и виртуальных переменных класса.
А с дельфевой реализацией это можно сделать, только не знаю еще как. Через атрибуты можно сделать, но не так красиво и главное быстро.
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, s.ts, Вы писали:
ST>как можно попроще реализовать статические виртуальные методы для класса (не городя фабрик и т.п.) на С# ? ST>поделитесь плз. у кого какие идеи по этому поводу ?
ST>вообще как это должно выглядеть по-нормальному ?
Вы можете кричать здесь хоть до ночи, а мне не хватает виртуальных переменных классов.
И что бы вызов не через атрибуты, рефлексии итд.
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, Serginio1, Вы писали:
S>> Кроме того организован он как в Delphi ссылка в VMT с отрицательным смещением(по поводу C++ был спор и ответ получил что не определено) S>>и по сути все его методы можно считать статическими виртуальными. S>>Метаклассы несут ту же нагрузку только расширяемы.
VD>Очень советую не говорить о том, о чем имешь поверхностное представление. Если действительно интересно как устроена рантайм-информация о типах в дотнет ищи в гугле по словам metod table, fjit.
Это просто реализация. Сам Type это синглтон ассоциированный с классом, ничем не отличающийся от понятия метаклассов. Теже переопределения виртуальных методов.
и солнце б утром не вставало, когда бы не было меня
Есть class A и B,C от него.
1) Если надо узнать какой тип у существующей объекта, то можно использовать virtual функцию.
2) static подразумевает возможное отсутствие объекта данного типа ...
нет объекта для чего virtual ?
вызывая static — Вы сами должны указать class A,B,C
Здравствуйте, Serginio1, Вы писали:
S> А смысл его держать. По затратам получается как физическим так и скорости выполнения программы, что новый объект создать проще.
При 10 млн. вызовов? Мягко говоря не уверен.
S>А с дельфевой реализацией это можно сделать, только не знаю еще как.
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, Serginio1, Вы писали:
S>> А смысл его держать. По затратам получается как физическим так и скорости выполнения программы, что новый объект создать проще.
AVK>При 10 млн. вызовов? Мягко говоря не уверен.
10 млн. вызовов около одной сек это на Net это если держать ссылку на них, на Native значительно меньше и если не держать ссылок то GC справляется на ура. На рефлексию уйдет значительно больше. На доступ к откэшируемым объетам то же самое получается.
S>>А с дельфевой реализацией это можно сделать, только не знаю еще как.
AVK>
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Serginio1, Вы писали:
S> Вы можете кричать здесь хоть до ночи, а мне не хватает виртуальных переменных классов. S>И что бы вызов не через атрибуты, рефлексии итд.
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, Serginio1, Вы писали:
S>> Вы можете кричать здесь хоть до ночи, а мне не хватает виртуальных переменных классов. S>>И что бы вызов не через атрибуты, рефлексии итд.
AVK>И для чего ты написал это сообщение?
Да на самом деле флуд в ветке разошелся. Просто с точки зрения ООП метаклассы и реализуемые через них виртуальные статические методы и переменные нормальное явление, т.к. полиморфизм возможен не только для экземпляров класса, но и для самих классов. Так есть данные и методы относящиеся только к классу а не к объекту, и их разграничение было бы только полезным. А говорить, что это не нужно потому что есть эти же аналоги метаклассов но в другом обличие (атрибуты, Type), устал слушать.
Посмотрим время покажет.
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Serginio1, Вы писали:
S>>> Вы можете кричать здесь хоть до ночи, а мне не хватает виртуальных переменных классов. S>>>И что бы вызов не через атрибуты, рефлексии итд.
AVK>>И для чего ты написал это сообщение? S> Да на самом деле флуд в ветке разошелся. Просто с точки зрения ООП метаклассы и реализуемые через них виртуальные статические методы и переменные нормальное явление, т.к. полиморфизм возможен не только для экземпляров класса, но и для самих классов. Так есть данные и методы относящиеся только к классу а не к объекту, и их разграничение было бы только полезным. А говорить, что это не нужно потому что есть эти же аналоги метаклассов но в другом обличие (атрибуты, Type), устал слушать. S> Посмотрим время покажет.
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, Serginio1, Вы писали:
S>>>> Вы можете кричать здесь хоть до ночи, а мне не хватает виртуальных переменных классов. S>>>>И что бы вызов не через атрибуты, рефлексии итд.
AVK>>>И для чего ты написал это сообщение? S>> Да на самом деле флуд в ветке разошелся. Просто с точки зрения ООП метаклассы и реализуемые через них виртуальные статические методы и переменные нормальное явление, т.к. полиморфизм возможен не только для экземпляров класса, но и для самих классов. Так есть данные и методы относящиеся только к классу а не к объекту, и их разграничение было бы только полезным. А говорить, что это не нужно потому что есть эти же аналоги метаклассов но в другом обличие (атрибуты, Type), устал слушать. S>> Посмотрим время покажет.
AVK>На заданный вопрос ты так и не ответил
Вроде все онятно написано. А если и этого не достаточно то
Вспомнил песню, оценил содержимое и написал.
В песне звучали слова "Вы можете кричать здесь хоть до ночи, а пленку я давно истратил всю"
и солнце б утром не вставало, когда бы не было меня
M>>По части workaround они в Delphi хорошо поработали. Я где-то полгода назад читал, что там наворотили. Очень прикольно, ловкачи просто.
VD>Хакреы. Ну, да их понять можно. Все это для совместимости с кодом написанным под старые версии дельфи. Со временем уйдет в небытие.
Да, именно для совместимости. И какой-то неплохой прогресс у них в этом деле есть. Delphi.NET это не просто адаптирование Паскаля под .NET, там многие казусы-несовместимости аккуратно зализаны.
К примеру, используя контролы WinForms, они ухитряются достаточно ловко маскироваться — значительная часть свойств и методов VCL работают. Для этого изобретена парадигма классов-хелперов. Такое себе расширение на уровне языка. Напоминает по духу IExtenderProvider, но встроенное в сам язык.
Может, вам в R# такое подумать? Забавная вещь
M>>Жаль, что это теперь мало кому нужно.
VD>Почему жаль?
Как говорится, из эстетических побуждений. Жалко, красота пропадает.
AVK>>При 10 млн. вызовов? Мягко говоря не уверен. S> 10 млн. вызовов около одной сек это на Net это если держать ссылку на них, на Native значительно меньше и если не держать ссылок то GC справляется на ура. На рефлексию уйдет значительно больше. На доступ к откэшируемым объетам то же самое получается.
Здравствуйте, mihailik, Вы писали:
AVK>>>При 10 млн. вызовов? Мягко говоря не уверен. S>> 10 млн. вызовов около одной сек это на Net это если держать ссылку на них, на Native значительно меньше и если не держать ссылок то GC справляется на ура. На рефлексию уйдет значительно больше. На доступ к откэшируемым объетам то же самое получается.
M>Клинический случай, хоть студентов приводи
Ты о чем????
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Igor Trofimov, Вы писали:
iT>В решении указанных задачек. AVK уже отказался.
Решение я тебе привел. Короче в трое получилось.
iT>Читаем выше. Информация, возвращаемая GetType слишком общая.
Чем же это? Вся информация о типе за исключением кода методов.
iT> И я хочу получать информацию о типе от ссылки на тип, а не от экземпляра.
В дотнете, ссылка на тип и есть информация о типе. Чтобы ее плучить можно вызвать typeof(), но это уже компайл-тайм функция.
VD>>2. Динамическое создание экземпляра объекта. Это решается Activator-ом. iT>Ни слова не было про то, что нужно создавать эзкемпляр. Задачки не про это.
А зачем тогда вообще вам эти мета-лассы? Чтобы получить доступ к информации о типх через одно место?
... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Serginio1, Вы писали:
S> Это просто реализация. Сам Type это синглтон ассоциированный с классом, ничем не отличающийся от понятия метаклассов. Теже переопределения виртуальных методов.
Type — это ОО-обертка над системной информацией, т.е. над метаданными. И зачем ей какие-то виртаельные методы не ясно.
... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Igor Trofimov, Вы писали:
VD>>Привыкли все делать одним путем напоминающим русское достижение в области удалния кланд и считаете что других путей нет: VD>>
VD>>Type type = dataSetCastToObject.GetType();
VD>>Console.WriteLine(type.Name);
VD>>
iT>Задачка не решена. Продолжаем развлекаться.
Задачка решана. Завязываем.
... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, s.ts, Вы писали:
ST>визитор работает с инстанциями и не накладывает ограничений на отношения объектов (имеется ввиду контроль того, что объекты из одной ветки иерархии классов). ST>мне это все больше напоминает абстрактную фабрику.
Подходы разные бывают.
ST>кстати, вопрос о виртуальном конструкторе не ввергает всех в шок?
Меня нет. Даже не оборот.
ST>а ведь он [конструктор] тоже в некотором смысле статический метод.
Ну, это ты глупость сморозил. Конструктор в языках вроде С++/C# самый что нинаесть обычный метод. Получает неявный this и позволяет вызывать методы экземпляра.
Не прийми за наезд, но сдается мне, что все же кроме Дельфи ты все же не изучил как следует других языков. Уж больно твои суждения всегда не нее сваливаются.
ST>p.s. вопрос тут более абстрактен, чем дельфи vs... также долго можно спорить о том, как должны виртуальные функции из конструктора вызываться или о чем-то другом и это уже не будет delphi vs...
Я не очень понимаю как связаны эти вопросы. Но четко вижу, что сам вопрос вам до лампочки. Вам просто не нравится, что сделано не так как в Дельфи.
ST>на всякий случай повторюсь, что меня интересовала возможность реализации схожей функциональности в дотнете, а не споры о "нужно/не нужно"
Еще раз повторю, если бы тебя это интересовало бы, то ты бы обяснил каких целей хочешь добиться, а не искал бы экзотических фич дельфи в совершенно другом по иделологии продукте.
... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, mihailik, Вы писали:
M>>>Клинический случай, хоть студентов приводи S>> Ты о чем????
M>Ну, казуистика просто дальше некуда.
M>10 млн вызовов — это всё-таки много или мало, нужно или не нужно. Разъясни заинтригованым радиослушателям. Ёжики плакали, кололись, но грызли кактус?
M>В общем, подозрения падают в первую очередь на какой-нибудь Бочкарёв. Клинское к таким эффектам у меня не приводило
Да нет задача описывалась выше. И связана она с БД и полями неопределенного тип из которого нужно создать объект, а т.к. записей надо просчитывать миллионы, то такая задача реально выполняется. Но если ты посмотришь на Net 2003 то посчитай сколько упаковок и распаковок у тебя вылезает.
Например в DataSet. И никого она в трепет не вводит. И народ еще и по миллионам записей таскает.
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, mihailik, Вы писали:
S>>И никого она в трепет не вводит. И народ еще и по миллионам записей таскает.
M>То есть всё круто? И в чём тогда проблема?
А в чем круто???? Не знаю. У меня нет проблем. Но это очень специфическая задача.
И если внимательно посмотреть, то поиск по индексу тормознет процесс еще как.
Речь шла о локальных БД. Для SQL эта задача если и проходит то с таким скрипом.
и солнце б утром не вставало, когда бы не было меня
iT>>В решении указанных задачек. AVK уже отказался. VD>Решение я тебе привел. Короче в трое получилось.
Не-а. ты похоже, все-таки не понял, что требовалось.
iT>>Читаем выше. Информация, возвращаемая GetType слишком общая. VD>Чем же это? Вся информация о типе за исключением кода методов.
Читаем выше. Я хочу СВОЮ информацию о типе.
VD>>>2. Динамическое создание экземпляра объекта. Это решается Activator-ом. iT>>Ни слова не было про то, что нужно создавать эзкемпляр. Задачки не про это.
VD>А зачем тогда вообще вам эти мета-лассы? Чтобы получить доступ к информации о типх через одно место?
VD>Фигню не гвори. Это же не макросы. Создавай код (хоть эмитом) и расширяй на здоровье.
О! Новое слово. "Фигня".
S>> Тебе хватает type.Name, а кому то нужно несколько другое представление и отображение.
VD>Впримере было получение имени. Вам уже тут не раз говорилось — говорите не как делать, а что делать.
Говорили, что нужно. Но вместо этого ты предпочел вытащить имя типа. Спасибо, всю жизнь мечтали.
Еще раз формулирую (третий?) — вытащи мне количество таблиц из ссылки на тип типизированного DataSet'а.
Здравствуйте, mihailik, Вы писали:
S>>>>И никого она в трепет не вводит. И народ еще и по миллионам записей таскает.
M>>>То есть всё круто? И в чём тогда проблема?
S>> А в чем круто????
M>Опять к зайцам
M>Всё-таки быстро 10 млн объектов создавать или нет, ты как-то определись. Хорошо — создавай, плохо — не создавай.
А куда мне деваться. Я бы и согласен не создавать, только так быстрее получается или на том же уровне если кэшировать объекты для повторного использования без их создания, но считывая в них новую инфрмацию . Посмотрел и так и эдак разницы нет а трудозатрат больше. А вот в 2003 у тебя нет альтернативы.
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, mihailik, Вы писали:
S>>>>И никого она в трепет не вводит. И народ еще и по миллионам записей таскает.
M>>>То есть всё круто? И в чём тогда проблема?
S>> А в чем круто????
M>Опять к зайцам
M>Всё-таки быстро 10 млн объектов создавать или нет, ты как-то определись. Хорошо — создавай, плохо — не создавай.
А вот как ты считаешь как организована десериализация объектов в Юкон????
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Igor Trofimov, Вы писали:
VD>>Фигню не гвори. Это же не макросы. Создавай код (хоть эмитом) и расширяй на здоровье.
iT>О! Новое слово. "Фигня".
Где же ты живешь, если таких слов не знашь.
iT>Говорили, что нужно. Но вместо этого ты предпочел вытащить имя типа. Спасибо, всю жизнь мечтали. iT>Еще раз формулирую (третий?) — вытащи мне количество таблиц из ссылки на тип типизированного DataSet'а.
В типизированном датасете это набор коллекций. Получи их количество и пользуйся.
... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Igor Trofimov, Вы писали:
iT>Ладно, мне тоже это все надоело. Но я остался убежден, что ты так и не понял, чего мы хотим. iT>AVK вроде понял, но он концептуально против
Мы оба вас понять не можем. И знаешь почему? Потому что вы сами не знаете что вам надо.
... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, mihailik, Вы писали:
M>К примеру, используя контролы WinForms, они ухитряются достаточно ловко маскироваться — значительная часть свойств и методов VCL работают. Для этого изобретена парадигма классов-хелперов. Такое себе расширение на уровне языка. Напоминает по духу IExtenderProvider, но встроенное в сам язык.
Я в курсе.
M>Может, вам в R# такое подумать? Забавная вещь
Зачем? У нас свои методы.
M>Как говорится, из эстетических побуждений. Жалко, красота пропадает.
... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
iT>>Не-а. ты похоже, все-таки не понял, что требовалось. VD>Значит так объясняете.
Возможно
iT>>Читаем выше. Я хочу СВОЮ информацию о типе. VD>Добавляей отрибуты.
Во! Именно! Выше я как раз спорил с AVK, чем атрибуты в данном случае плохи.
Спор этот не голословный — я с этими атрибутами уже накушался сполна, когда информации о типах действительно много и она действительно часто нужна. Неудобно. И нет жесткого контракта.
iT>>О! Новое слово. "Фигня". VD>Где же ты живешь, если таких слов не знашь.
Я еще и не такие знаю. Но только не тороплюсь употреблять
iT>>Говорили, что нужно. Но вместо этого ты предпочел вытащить имя типа. Спасибо, всю жизнь мечтали. iT>>Еще раз формулирую (третий?) — вытащи мне количество таблиц из ссылки на тип типизированного DataSet'а.
VD>В типизированном датасете это набор коллекций. Получи их количество и пользуйся.
Здравствуйте, Igor Trofimov, Вы писали:
iT>Во! Именно! Выше я как раз спорил с AVK, чем атрибуты в данном случае плохи. iT>Спор этот не голословный — я с этими атрибутами уже накушался сполна, когда информации о типах действительно много и она действительно часто нужна. Неудобно. И нет жесткого контракта.
Не знаю. У нас пол Хоума на них сделано. Все ОК. Дельфи отдыхает по полной программе.
... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Igor Trofimov, Вы писали:
VD>>В типизированном датасете это набор коллекций. Получи их количество и пользуйся.
iT>Из ссылки на тип, плиз.
Что? А из чего еще можно?
... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Igor Trofimov, Вы писали:
VD>>>>В типизированном датасете это набор коллекций. Получи их количество и пользуйся. iT>>>Из ссылки на тип, плиз. VD>>Что? А из чего еще можно?
iT>Ну покажи, покажи.
Т.е. у тебя самого воображения что ли не хватает. Ну, нечто вроде этого:
// CustomersDataSet - это типизированный датасет. На его месте мог бы быть любой. :)
Type type = typeof(CustomersDataSet);
int tablesCount = 0;
foreach (PropertyInfo prop in type.GetProperties())
{
if (prop.PropertyType.IsSubclassOf(typeof(DataTable)))
{
tablesCount++; // Собственно тут можно изучать датасеты.
}
}
Console.WriteLine("Количество датасетов: " + tablesCount);
... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
VD>Т.е. у тебя самого воображения что ли не хватает. Ну, нечто вроде этого:
VD>
VD>// CustomersDataSet - это типизированный датасет. На его месте мог бы быть любой. :)
VD>Type type = typeof(CustomersDataSet);
VD>int tablesCount = 0;
VD>foreach (PropertyInfo prop in type.GetProperties())
VD>{
VD> if (prop.PropertyType.IsSubclassOf(typeof(DataTable)))
VD> {
VD> tablesCount++; // Собственно тут можно изучать датасеты.
VD> }
VD>}
VD>Console.WriteLine("Количество датасетов: " + tablesCount);
VD>
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, s.ts, Вы писали:
ST>>визитор работает с инстанциями и не накладывает ограничений на отношения объектов (имеется ввиду контроль того, что объекты из одной ветки иерархии классов). ST>>мне это все больше напоминает абстрактную фабрику.
VD>Подходы разные бывают.
ST>>кстати, вопрос о виртуальном конструкторе не ввергает всех в шок?
VD>Меня нет. Даже не оборот.
ST>>а ведь он [конструктор] тоже в некотором смысле статический метод.
каюсь, тут, наверное, я тоже на дельфи съехал — там он действительно в нек. смысле статичен
(TMyClass.Create)
VD>Не прийми за наезд, но сдается мне, что все же кроме Дельфи ты все же не изучил как следует других языков. Уж больно твои суждения всегда не нее сваливаются.
изучил, изучил. но это знание из дешевых, так что... что сейчас вижу — о том пою...
м.быть мои суждения и сваливаются на делфи.
я же говорил уже чем последние полтора года занимаюсь ?
там еще беда с терминологией. у борланд-классов есть 3 типа методов:
1.статические
2.виртуальные
3.методы класса
статические — это то, что в сях называется member-ами
виртуальные — то же самое что и везде
методы класса — в сях называется статическими
я в свое время переучивался, чтобы на одном языке с коллегами говорить. теперь, видать, обратно придется
а вам, в свете миграции дельфистов на дотнет, видать, придется изучить и ту терминологию, чтобы флейма, аналогичного этому топику, было поменьше
ST>>p.s. вопрос тут более абстрактен, чем дельфи vs... также долго можно спорить о том, как должны виртуальные функции из конструктора вызываться или о чем-то другом и это уже не будет delphi vs...
VD>Я не очень понимаю как связаны эти вопросы. Но четко вижу, что сам вопрос вам до лампочки. Вам просто не нравится, что сделано не так как в Дельфи.
нет. все наоборот.
мне нравится как это сделано в дельфи, но я не знаю как сделано в дотнете и поэтому задаю вопросы
ничего, что я так откровенно ?
еще мне нравится, что там (в дельфи) из конструктора виртуальные методы вызываются не как обычные мемберы (в терминологии дельфи их нужно было бы назвать статическими ). больше там ничего интересного имхо нету (ну, м.б. вызов inherited конструкторов/деструкторов в произвольном месте, но это уже не критично)
ST>>на всякий случай повторюсь, что меня интересовала возможность реализации схожей функциональности в дотнете, а не споры о "нужно/не нужно"
VD>Еще раз повторю, если бы тебя это интересовало бы, то ты бы обяснил каких целей хочешь добиться, а не искал бы экзотических фич дельфи в совершенно другом по иделологии продукте.
что самое удивительное, Igor Trofimov и Serginio1 сразу поняли что я имел ввиду.
видимо, и вопрос к ним был, а не к тебе.
кстати, по тем веткам, где предприняты попытки объяснить, видно, что это бесполезно, т.к. сводится к "зачем"
я для себя сабж выяснил
а флейм все множится
вообще можно жить очень без многого, даже без классов и объектов, которые, в общем-то тоже как "синтаксический сахар" (вспомним, что на некоторых платформах до сих пор C++ — это препроцессор в C )
M>>Всё-таки быстро 10 млн объектов создавать или нет, ты как-то определись. Хорошо — создавай, плохо — не создавай. S> А вот как ты считаешь как организована десериализация объектов в Юкон????
Ну только не говори, что они на каждый объект они свой тип создают.
AVK>Два вопроса:
AVK>1) Ты не привел реализацию TableCount AVK>2) Откуда берется ссылка на тип?
Как сам понимаешь, я это писал при условии, что статические виртуалы и метаклассы есть.
Отвечаю в обратном порядке (так понятнее будет)
2) ссылку на тип я беру, как и Vlad просто из конкретного типа (для простоты) и затем привожу к типу метакласса:
(DataSetType)typeof(CustomersDataSet)
То есть имеется метатип DataSetType. У него есть статическое виртуальное свойство TableCount.
1) "реализация" может быть примерно такая:
abstract class DataSet // это базовый тип
{
static virtual int TableCount { get; }
}
class CustomerDataSet : DataSet // это конкретный потомок
{
static override int TableCount { return 10; }
}
По-моему это гораздо проще, написано на более высоком уровне, тут нет рефлекшена и нет атрибутов. Пишется в терминах модели предметной области, а не в терминах абстрактных типов.
Здравствуйте, mihailik, Вы писали:
M>>>Всё-таки быстро 10 млн объектов создавать или нет, ты как-то определись. Хорошо — создавай, плохо — не создавай. S>> А вот как ты считаешь как организована десериализация объектов в Юкон????
M>Ну только не говори, что они на каждый объект они свой тип создают.
Здравствуйте, Igor Trofimov, Вы писали:
iT>2) ссылку на тип я беру, как и Vlad просто из конкретного типа (для простоты) и затем привожу к типу метакласса: iT>
iT>(DataSetType)typeof(CustomersDataSet)
iT>
Я так и думал. В таком разе все твои виртуальные методы превращаются в идиотизм, поскольку ничем не лучше КонкретныйТип.TableCount.
iT>class CustomerDataSet : DataSet // это конкретный потомок iT>{ iT> static override int TableCount { return 10; } iT>}
10 откуда? От балды?
iT>По-моему это гораздо проще, написано на более высоком уровне, тут нет рефлекшена и нет атрибутов. Пишется в терминах модели предметной области, а не в терминах абстрактных типов.
Пока что твой код абсолютно бессмысленен с практической точки зрения.
iT>>и чего — по-прежнему первый вариант ничуть не сложнее, не меее надежен, не менее производителен?
AVK>Два вопроса:
AVK>1) Ты не привел реализацию TableCount AVK>2) Откуда берется ссылка на тип?
Дельфевый вариант, если TableCount
Class Function TableCount:Integer; virtual;
данной записи выглядит так
CustomersDataSet.TableCount;
Получение метакласса из объекта.
Function DataSetTypeTableCount(V:Object):Integer;
Begin
result:=DataSetType(V.ClassType).TableCount
end;
По поводу атрибутов, то если часто к ним обращаться и не кэщировать толку от них мало.
Так как Attribute.GetCustomAttribute не очень быстрая.
Статические виртуальные методы ускоряют получение информации, хотя в Net реализации приходится лезть в хэш таблицу для получения метакласса ассоциированного с типом в хэш таблицу, но это все равно во много раз быстрее чем Attribute.GetCustomAttribute.
Если же тип известен или то вызов метода метакласса идет на прямую.
Можно рассматривать атрибуты как статическую не изменяемую информацию связанной с типом.
В метаклассах такой зависимости нет.
Можно рассматривать метаклассы и атрибуты по аналогии как абстрактные классы и интерфейсы.
Если же ссылку на метакласс прописывать в VMT так же как и для Type то затраты на получение
метакласса минимальны, а информации ассоциированной с данным классом можно прописать сколько угодно, и очень удобный доступ к ней.
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, mihailik, Вы писали:
M>>>Всё-таки быстро 10 млн объектов создавать или нет, ты как-то определись. Хорошо — создавай, плохо — не создавай. S>> А вот как ты считаешь как организована десериализация объектов в Юкон????
M>Ну только не говори, что они на каждый объект они свой тип создают.
А вообще о чем разговор. При чем здесь тип.
Речь идет о том, что если у меня тип заранее известен, то я считываю данные прямо в объект предварительно один раз создав.
Если же поле у меня неопределенного типа, то по полю TypeID я должен найти конструктор этого типа
передать ему ID объекта, что бы он загрузил данные.
В данном случае разговор идет, что я с TypeID ассоциирую метакласс, а мне говорт что лучше Type
Но при этом с использовать метакласс намного удобнее быстрее и типизированно чем Type.
Еще не понял?????
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Serginio1, Вы писали:
S> Дельфевый вариант, если TableCount S>Class Function TableCount:Integer; virtual; S> данной записи выглядит так S>CustomersDataSet.TableCount;
Это не реализация, это декларация.
S>Получение метакласса из объекта. S>Function DataSetTypeTableCount(V:Object):Integer; S> Begin S>result:=DataSetType(V.ClassType).TableCount S> end;
Это мы уже видели.
S>По поводу атрибутов, то если часто к ним обращаться и не кэщировать толку от них мало.
А что мешает кешировать?
S> Статические виртуальные методы ускоряют получение информации, хотя в Net реализации приходится лезть в хэш таблицу для получения метакласса ассоциированного с типом в хэш таблицу, но это все равно во много раз быстрее чем Attribute.GetCustomAttribute.
Ну да. А если в Дельфи получать метаинформацию путем парсинга исходников то будет еще медленнее.
S> Можно рассматривать атрибуты как статическую не изменяемую информацию связанной с типом. S>В метаклассах такой зависимости нет.
Нет там никакой разницы. Есть данные, которые в обеих случаях неизменны и есть код. Атрибут тоже может содержать код.
AVK> Я так и думал. В таком разе все твои виртуальные методы превращаются в идиотизм, поскольку ничем не лучше КонкретныйТип.TableCount.
Конечно. Просто я делал по аналдогии с примером Vlad'а, чтобы было понятнее.
Естественно, в реальном коде это была бы ссылка на тип, преданная в параметре, например:
Так понятнее вся мощь и выразительность? И попробуй сунуть в этот метод typeof(Int32)! И не надо проверять — есть атрибут, нет его, есть ли он в предке... и сколько их есть, если не дай бог, несколько можно.
AVK>10 откуда? От балды?
Оттуда же, откуда ты написал бы атрибут DataTableCountAttribute со значением 10. Конкретный тип знает это про себя.
VariantDataSet : DataSet может, впрочем, считать это и как-то по-другому, например, как Влад нарисовал.
Полиморфность остается — я все равнот смогу обратиться через простое свойство.
iT>>По-моему это гораздо проще, написано на более высоком уровне, тут нет рефлекшена и нет атрибутов. Пишется в терминах модели предметной области, а не в терминах абстрактных типов.
AVK>Пока что твой код абсолютно бессмысленен с практической точки зрения.
Ну это же пример. Ты всегда критикуешь за практическую неприменимость примеры подходов?
S>>По поводу атрибутов, то если часто к ним обращаться и не кэщировать толку от них мало.
AVK>А что мешает кешировать?
Зачем тогда атрибуты, если для каждой иерархии классов я могу и так создать хэштаблицу данных и прописывать в нее нужные данные для каждого типа в конструкторе типа, причем без всяких ограничений на определении конструктора,полей и свойств атрибутного типа итд.
S>> Статические виртуальные методы ускоряют получение информации, хотя в Net реализации приходится лезть в хэш таблицу для получения метакласса ассоциированного с типом в хэш таблицу, но это все равно во много раз быстрее чем Attribute.GetCustomAttribute.
AVK>Ну да. А если в Дельфи получать метаинформацию путем парсинга исходников то будет еще медленнее.
Да только эта информация кэшируется автоматом и не надо производить лишних действий.
S>> Можно рассматривать атрибуты как статическую не изменяемую информацию связанной с типом. S>>В метаклассах такой зависимости нет.
AVK>Нет там никакой разницы. Есть данные, которые в обеих случаях неизменны и есть код. Атрибут тоже может содержать код.
Атрибут это класс, но опять же, без кэширования в нем мало толку, а с кэшированием смотри выше.
и солнце б утром не вставало, когда бы не было меня
Это не ответ. Откуда изначально возьмется эта ссылка?
iT>Так понятнее вся мощь и выразительность? И попробуй сунуть в этот метод typeof(Int32)! И не надо проверять — есть атрибут, нет его, есть ли он в предке... и сколько их есть, если не дай бог, несколько можно.
Зато я могу прикрутить сколь угодно много параллельных механик.
AVK>>Пока что твой код абсолютно бессмысленен с практической точки зрения.
iT>) Ну это же пример. Ты всегда критикуешь за практическую неприменимость примеры подходов?
Тебя просили задачу, а ты привел бессмысленный с практической точки зрения код.
Здравствуйте, Serginio1, Вы писали:
AVK>>А что мешает кешировать? S> Зачем тогда атрибуты, если для каждой иерархии классов я могу и так создать хэштаблицу данных и прописывать в нее нужные данные для каждого типа в конструкторе типа, причем без всяких ограничений на определении конструктора,полей и свойств атрибутного типа итд.
Очень просто — кеширование делается в библиотеке, а атрибуты прописывает пользователь.
AVK>>Нет там никакой разницы. Есть данные, которые в обеих случаях неизменны и есть код. Атрибут тоже может содержать код. S> Атрибут это класс, но опять же, без кэширования в нем мало толку,
В нем достаточно толку. Я тебе уже писал — производительность в случае анализа метаданных некритична, поскольку самих метаданных мало. Если ты не можешь построить алгоритм так чтобы он не перечитывал миллионы раз одну и ту же информацию то это твои проблемы, а не проблемы языка. И кеширование это один из возможных способов этого избежать, но далеко не единственный.
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, Serginio1, Вы писали:
AVK>>>А что мешает кешировать? S>> Зачем тогда атрибуты, если для каждой иерархии классов я могу и так создать хэштаблицу данных и прописывать в нее нужные данные для каждого типа в конструкторе типа, причем без всяких ограничений на определении конструктора,полей и свойств атрибутного типа итд.
AVK>Очень просто — кеширование делается в библиотеке, а атрибуты прописывает пользователь.
Ага я же изготовитель я же и пользователей. AVK>>>Нет там никакой разницы. Есть данные, которые в обеих случаях неизменны и есть код. Атрибут тоже может содержать код. S>> Атрибут это класс, но опять же, без кэширования в нем мало толку,
AVK>В нем достаточно толку. Я тебе уже писал — производительность в случае анализа метаданных некритична, поскольку самих метаданных мало. Если ты не можешь построить алгоритм так чтобы он не перечитывал миллионы раз одну и ту же информацию то это твои проблемы, а не проблемы языка. И кеширование это один из возможных способов этого избежать, но далеко не единственный.
Опять об одном и томже. Есть данные касающиеся только класса, а есть данные экземпляра класса.
Причем данные в иерархии классов по структуре одинаковы, но данные разные.
И в этом случае она должна разделяться. И доступ как к данным объекта так и данным класса должна быть быстрый и синтаксически простой. При чем доступ из объекта как к своим данным так и к данным класса.
Обычно все данные связанные с классом тянут на объект увеличивая его размер, но увиличивая скорость доступа. Метаданные как раз могут решить проблему грамотного разделения данных и скорость доступа и типизацию.
Кстати не ответил на ограничения в атрибутах????
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Serginio1, Вы писали:
AVK>>В нем достаточно толку. Я тебе уже писал — производительность в случае анализа метаданных некритична, поскольку самих метаданных мало. Если ты не можешь построить алгоритм так чтобы он не перечитывал миллионы раз одну и ту же информацию то это твои проблемы, а не проблемы языка. И кеширование это один из возможных способов этого избежать, но далеко не единственный.
S> Опять об одном и томже. Есть данные касающиеся только класса, а есть данные экземпляра класса. S> Причем данные в иерархии классов по структуре одинаковы, но данные разные.
Тогда это уже не метаданные и статические виртуальные методы уж точно не годятся. Тут обычные виртуальные.
S> И в этом случае она должна разделяться. И доступ как к данным объекта так и данным класса должна быть быстрый и синтаксически простой. При чем доступ из объекта как к своим данным так и к данным класса.
Ты никак не хочешь понять одну простую вещь — обращение к метаданным много миллионов раз, неважно откуда с полным их перечитыванием это ошибка дизайна.
S> Обычно все данные связанные с классом тянут на объект увеличивая его размер, но увиличивая скорость доступа.
Не знаю, я таких решений что то не встречал. Обычно это в твоем коде?
S>Метаданные как раз могут решить проблему грамотного разделения данных и скорость доступа и типизацию. S> Кстати не ответил на ограничения в атрибутах????
AVK>Это не ответ. Откуда изначально возьмется эта ссылка?
Да откуда угодно. Например, при перечислении всех типов — потомков DataSet. Или из настройки/из БД.
Если ты хочешь мне сказать, что раз там уже знают конкретный тип, то значит, там точно знают число таблиц, то будешь неправ. Я тогда по аналогии могу сказать про виртуальные методы экземпляра — изначально объект где-то создается, там точно знают конкретный тип, вот путь и вызывают SaveCustomer() вместо virtual Save().
iT>>Так понятнее вся мощь и выразительность? И попробуй сунуть в этот метод typeof(Int32)! И не надо проверять — есть атрибут, нет его, есть ли он в предке... и сколько их есть, если не дай бог, несколько можно.
AVK>Зато я могу прикрутить сколь угодно много параллельных механик.
Да я согласен, что это не панацея Я просто утверждаю, что в каких-то случаях это реально полезная концепция, стройная и естественным образом вытакающая из возможности хоть как-то работать с типами.
Да, атрибутами можно сделать гибче. Но далеко не всегда проще, удобнее, быстрее и надежнее. И что жаль, что такого механизма нет в clr — он бы никому не помешал, а только помог бы.
iT>>) Ну это же пример. Ты всегда критикуешь за практическую неприменимость примеры подходов? AVK>Тебя просили задачу, а ты привел бессмысленный с практической точки зрения код.
Я фигею — для объяснения преимуществ foreach ты тоже не ограничишься пятью строками, а будешь брать целую практическую задачу? неужели недостаточно того, что мы рассмотрели, чтобы понять, где плюсы, где минусы?
Или тебе необходимо именно обоснование, почему нужна статическая виртуальная информация о типе? Тогда возьми любое место, где применяются атрибуты и найдешь там парочку таких мест, где по логике это статическая виртуальная информация.
Например, AttributeUsageAttribute. У любого атрибута эта информация должна быть. Она статична. Доступ полиморфный. То есть можно было бы написать
class Attribute
{
public abstract AttributeTargets Targets {get;}
public abstract bool Inherited {get;}
public abstract bool AllowMultiple {get;}
}
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, Serginio1, Вы писали:
AVK>>>В нем достаточно толку. Я тебе уже писал — производительность в случае анализа метаданных некритична, поскольку самих метаданных мало. Если ты не можешь построить алгоритм так чтобы он не перечитывал миллионы раз одну и ту же информацию то это твои проблемы, а не проблемы языка. И кеширование это один из возможных способов этого избежать, но далеко не единственный.
S>> Опять об одном и томже. Есть данные касающиеся только класса, а есть данные экземпляра класса. S>> Причем данные в иерархии классов по структуре одинаковы, но данные разные.
AVK>Тогда это уже не метаданные и статические виртуальные методы уж точно не годятся. Тут обычные виртуальные.
S>> И в этом случае она должна разделяться. И доступ как к данным объекта так и данным класса должна быть быстрый и синтаксически простой. При чем доступ из объекта как к своим данным так и к данным класса.
AVK>Ты никак не хочешь понять одну простую вещь — обращение к метаданным много миллионов раз, неважно откуда с полным их перечитыванием это ошибка дизайна.
Это ты не понимаешь. Я уже устал тебе перечислять все варианты. И прежде всего это связано с неопределенным типом объектов, но имеющих единую иерархию. В том, что добиться полной типизации невозможно хоть с этим ты согласен ???? И разумеется S>> Обычно все данные связанные с классом тянут на объект увеличивая его размер, но увиличивая скорость доступа.
AVK>Не знаю, я таких решений что то не встречал. Обычно это в твоем коде?
А ну да берем DataStorage
поля type и dbNullBits это информация класса, а она внедряется в объект.
Методы
public override object DefaultValue { get; }
и поля
defaultValue
defaultValueAsObject
итд.
Это информация класса, и через статические виртуальные методы она легко получается.
Но это примитивы. А когда аналог DataStorage являются более сложные объекты то ...
S>>Метаданные как раз могут решить проблему грамотного разделения данных и скорость доступа и типизацию. S>> Кстати не ответил на ограничения в атрибутах????
AVK>Какие?
Если еонкретно, допустимый набор типов данных ограничивается типами премитивов а также String, Type, Object. Кроме того, можно использовать одномерные массивы этих типов с осчетом от нуля.
Но не мне тебе объяснять.
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Igor Trofimov, Вы писали:
iT>Да откуда угодно. Например, при перечислении всех типов — потомков DataSet. Или из настройки/из БД.
Ну то есть из рефлекшена. В таком разе про типобезопасность и производительность можно забыть, все равно ковыряться в метаданных и явно приводить придется. Тут как — сказал а, говори б. Если мы имеем возможность виртуальности метаданных значит мы должны иметь и типизированный способ получения этих типов, так ведь?
iT>Если ты хочешь мне сказать, что раз там уже знают конкретный тип, то значит, там точно знают число таблиц, то будешь неправ.
Нет, я хочу сказать что когда мы имеем задачу в целом то оказывается что никакой выгоды от метаклассов практически нет. В Дельфи все тоже красиво на бумаге, а вот когда смотрим на реализацию и внешние условия то все становится далеко не так шоколадно.
AVK>>Зато я могу прикрутить сколь угодно много параллельных механик.
iT>Да я согласен, что это не панацея Я просто утверждаю, что в каких-то случаях это реально полезная концепция, стройная и естественным образом вытакающая из возможности хоть как-то работать с типами.
Ну вполне возможно что в каких то случаях да. Вопрос только в каких. Это я и пытаюсь выяснить, а вы упорно приводите решения частных задач. Вот к примеру нафига мне знать количество таблиц в типизированном датасете, если практически наверняка я буду писать механику для любых датасетов. Соответственно я не могу полагаться на то что эта информация общая для всего типа. Я ведь не зря привел PG. Это задачка очень широко использующая метаданные. Там есть очень много возможных применений метаинформации. ВОт и скажи мне — какую часть всей этой механики можно было бы упростить при наличии статических виртуальных методов.
iT>Да, атрибутами можно сделать гибче. Но далеко не всегда проще, удобнее, быстрее и надежнее. И что жаль, что такого механизма нет в clr — он бы никому не помешал, а только помог бы.
Знаешь, в clr много чего есть. Всегда следует рассматривать обе стороны монеты. Не только полезные но и вредные. И почему кстати останавливаться именно на этом уровне? Как только мы вводим типизированные варианты метаклассов (а ты, помнится, еще и интерфейсы предлагал) то сразу появится необходимость метаинформации об этих самых метаклассах. И так до бесконечности можно раскручиваться. По мне так куда логичнее не мешать ООП модель и метаданные, а сделать их перпендикулярными друг другу, т.е. метаданные описывают ООП модель, но при этом не являются ее частью. Если задуматься то эта мысль является реинкарнацией идеи об отделении контента от представления.
AVK>>Тебя просили задачу, а ты привел бессмысленный с практической точки зрения код.
iT>Я фигею — для объяснения преимуществ foreach ты тоже не ограничишься пятью строками, а будешь брать целую практическую задачу? неужели недостаточно того, что мы рассмотрели, чтобы понять, где плюсы, где минусы?
В данном случае нет, так как вопрос не в еще одной конструкции, а в концептуальном изменении языка.
iT>Или тебе необходимо именно обоснование, почему нужна статическая виртуальная информация о типе?
Нет, мне нужно обоснование почему она при этом должна являться частью той же самой ООП модели что и собственно классы.
iT>Например, AttributeUsageAttribute. У любого атрибута эта информация должна быть. Она статична. Доступ полиморфный. То есть можно было бы написать
iT>
iT>class Attribute
iT>{
iT> public abstract AttributeTargets Targets {get;}
iT> public abstract bool Inherited {get;}
iT> public abstract bool AllowMultiple {get;}
iT>}
iT>
Можно, но при этом компилятору пришлось бы создавать экземпляры атрибутов в процессе компиляции.
AVK>Нет, я хочу сказать что когда мы имеем задачу в целом то оказывается что никакой выгоды от метаклассов практически нет. В Дельфи все тоже красиво на бумаге, а вот когда смотрим на реализацию и внешние условия то все становится далеко не так шоколадно.
Если Type расширить до метакласса то все получится шоколадно. Даже не расширяя а просто добавляя как вспомогательный класс аналог Type, но со ссылкой в VMT. А метакласс ничем от обычного класса как и Type не отличается.
Посмотрим как на эту проблему, а может не проблему отреагируют создатели.
Если будет то удобно, если нет то и сишники безболезненно живут до сих пор, хотя и они признают полезность метаклассов, виртуальных статических методов и данных.
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Igor Trofimov, Вы писали:
iT>То есть имеется метатип DataSetType. У него есть статическое виртуальное свойство TableCount.
iT>1) "реализация" может быть примерно такая:
iT>
iT>abstract class DataSet // это базовый тип
iT>{
iT> static virtual int TableCount { get; }
iT>}
iT>class CustomerDataSet : DataSet // это конкретный потомок
iT>{
iT> static override int TableCount { return 10; }
iT>}
iT>
Нет слов. Т.е. ты предлагаешь вместо автоматического формирования метаинформации о типе создавать его вручную? Глупее ничего не видел.
Ну, тогда нет пробем выбрости свой virtual и будет тоже самое. virtual здесь никаким боком не упал.
iT>По-моему это гораздо проще, написано на более высоком уровне, тут нет рефлекшена и нет атрибутов. Пишется в терминах модели предметной области, а не в терминах абстрактных типов.
Что касается высоты уровня, то это проблема проффесианолизма. Любой грамотный программист сделает себе функцию или класс инкапсулирующие нужные ему действия. А вот вбивать вручную информацию которая формируется автоматический — это натуральный лам.
... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, AndrewVK, Вы писали:
AVK>Нет там никакой разницы. Есть данные, которые в обеих случаях неизменны и есть код. Атрибут тоже может содержать код.
Именно. В общем, метаклассы дельфи — это выход из ситуации который избрал Борланд. Чем-то хорший, чем-то плохой. В дотнете свои подходы. Ничем не худшие. Они просто другие. Так что еще раз приходим к выводу — на лицо неумение группы бывших дельфистов спокойно принимать другие технологии. В простонародье — это называется привычками и стереотипами. Так что проблема не в языках, а в головах.
... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Не так. new в С++-подобных языках это оператор. Считай внешная функция. Конструктор же это всегда метод. Просто у Страуструпа в определенный момент проснулась неудержимая забота о программисте и он решил защитить его от ошибок в отдельно взятом случае. Так сказать спас нас от граблей. Причем — это привело к куче других граблей. Не виртуальность конструктора это еще фигня. А вот не виртуальность виртуального деструктора — это еще та песьня. На эти грабли наступает половина программистов. Вторая просто читает о них на форума (орлов заучивших стандарт наизусть в рассчет не берем, ибо мало их). В Шарпе кострукторы и финалайзеры могут быть виртуальными. Это конечно потенциально опасно, но за-то совершенно логично. Я еще ни разу не встречал случаев наступания на эти грабли. А язык от этого получается концептуально стройным.
В форуме по С++ мы как то обсуждали эту проблему, и я предложил полноценное решение. Разбивать конструкторы и деструкторы на Before и After. Тогда можно будет иметь и место где перед уничтожением/созданием экземпляра можно произвести витруальный вызов (в полнос соотвествии с ОО-концепциями), и место строгих-пре(под)-действий.
... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Serginio1, Вы писали:
AVK>>Ты никак не хочешь понять одну простую вещь — обращение к метаданным много миллионов раз, неважно откуда с полным их перечитыванием это ошибка дизайна.
S> Это ты не понимаешь. Я уже устал тебе перечислять все варианты.
А что мне твои варианты? Это варианты внутри тобой разработанного дизайна. Если такое вылазит и нормально решить проблему никак значит надо искать проблемы в дизайне. Если дизайн нормален то там не должно быть обращения к одним и тем же данным много миллионов раз, особенно если это метаданные. Явный оверхед.
S> И прежде всего это связано с неопределенным типом объектов, но имеющих единую иерархию. В том, что добиться полной типизации невозможно хоть с этим ты согласен ????
Согласен. Хуже того — полной типизации невозможно добиться и в Дельфовом варианте. Вот кстати интересно — а дженерик атрибуты допустимы?
S>>> Обычно все данные связанные с классом тянут на объект увеличивая его размер, но увиличивая скорость доступа.
AVK>>Не знаю, я таких решений что то не встречал. Обычно это в твоем коде?
S> А ну да
Здравствуйте, Igor Trofimov, Вы писали:
iT>То есть имеется метатип DataSetType. У него есть статическое виртуальное свойство TableCount.
iT>1) "реализация" может быть примерно такая:
iT>
iT>abstract class DataSet // это базовый тип
iT>{
iT> static virtual int TableCount { get; }
iT>}
iT>class CustomerDataSet : DataSet // это конкретный потомок
iT>{
iT> static override int TableCount { return 10; }
iT>}
iT>
Нет слов. Т.е. ты предлагаешь вместо автоматического формирования метаинформации о типе создавать его вручную? Глупее ничего не видел.
Ну, тогда нет пробем выбрости свой virtual и будет тоже самое. virtual здесь никаким боком не упал.
iT>По-моему это гораздо проще, написано на более высоком уровне, тут нет рефлекшена и нет атрибутов. Пишется в терминах модели предметной области, а не в терминах абстрактных типов.
Что касается высоты уровня, то это проблема проффесианолизма. Любой грамотный программист сделает себе функцию или класс инкапсулирующие нужные ему действия. А вот вбивать вручную информацию которая формируется автоматический — это натуральный лам.
... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, AndrewVK, Вы писали:
AVK>Нет там никакой разницы. Есть данные, которые в обеих случаях неизменны и есть код. Атрибут тоже может содержать код.
Именно. В общем, метаклассы дельфи — это выход из ситуации который избрал Борланд. Чем-то хорший, чем-то плохой. В дотнете свои подходы. Ничем не худшие. Они просто другие. Так что еще раз приходим к выводу — на лицо неумение группы бывших дельфистов спокойно принимать другие технологии. В простонародье — это называется привычками и стереотипами. Так что проблема не в языках, а в головах.
... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Не так. new в С++-подобных языках это оператор. Считай внешная функция. Конструктор же это всегда метод. Просто у Страуструпа в определенный момент проснулась неудержимая забота о программисте и он решил защитить его от ошибок в отдельно взятом случае. Так сказать спас нас от граблей. Причем — это привело к куче других граблей. Не виртуальность конструктора это еще фигня. А вот не виртуальность виртуального деструктора — это еще та песьня. На эти грабли наступает половина программистов. Вторая просто читает о них на форума (орлов заучивших стандарт наизусть в рассчет не берем, ибо мало их). В Шарпе кострукторы и финалайзеры могут быть виртуальными. Это конечно потенциально опасно, но за-то совершенно логично. Я еще ни разу не встречал случаев наступания на эти грабли. А язык от этого получается концептуально стройным.
В форуме по С++ мы как то обсуждали эту проблему, и я предложил полноценное решение. Разбивать конструкторы и деструкторы на Before и After. Тогда можно будет иметь и место где перед уничтожением/созданием экземпляра можно произвести витруальный вызов (в полнос соотвествии с ОО-концепциями), и место строгих-пре(под)-действий.
... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, AndrewVK, Вы писали:
AVK>>Нет там никакой разницы. Есть данные, которые в обеих случаях неизменны и есть код. Атрибут тоже может содержать код.
VD>Именно. В общем, метаклассы дельфи — это выход из ситуации который избрал Борланд. Чем-то хорший, чем-то плохой. В дотнете свои подходы. Ничем не худшие. Они просто другие. Так что еще раз приходим к выводу — на лицо неумение группы бывших дельфистов спокойно принимать другие технологии. В простонародье — это называется привычками и стереотипами. Так что проблема не в языках, а в головах.
Да разговор вобщето не о Delphi. Там как раз нельзя хранить данные класса в метаклассе.
Тоесть есть иерархия классов у которых структура данных одинакова но по содержимому разная. Причем доступ к этим данным должен быть быстрым.
Виртуальные метаклассы вполне способны решить эту проблему причем ссылка на него должна быть в VMT. А так либо массив либо хэш таблица ассоциированная с типом. А насчет подходов, то I.. T... уже устал доказывать все плюсы и минусы.
Будет хорошо. Не будет тоже.
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Serginio1, Вы писали:
AVK>>Нет, я хочу сказать что когда мы имеем задачу в целом то оказывается что никакой выгоды от метаклассов практически нет. В Дельфи все тоже красиво на бумаге, а вот когда смотрим на реализацию и внешние условия то все становится далеко не так шоколадно.
S>Если Type расширить до метакласса то все получится шоколадно.
Ничего шоколадног не получится. Ты как этот Type получать собираешься? typeof? Смысла никакого нет. object.GetType()? Но он же нетипизированный, а значит результат ничем не лучше атрибутов. Assembly.GetTypes — та же фигня? Type.GetType() — и тут тоже самое. Метаклассы не избавляют от приведения, они их выносят в другое место.
S> Посмотрим как на эту проблему, а может не проблему отреагируют создатели.
Я тебе сразу скажу — никак.
S>Если будет то удобно, если нет то и сишники безболезненно живут до сих пор,
Ну я бы не сказал что безболезненно.
S> хотя и они признают полезность метаклассов, виртуальных статических методов и данных.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, s.ts, Вы писали:
ST>>так ?
VD>Не так. new в С++-подобных языках это оператор. Считай внешная функция.
но его можно перегрузить для класса
VD>Конструктор же это всегда метод. Просто у Страуструпа в определенный момент проснулась неудержимая забота о программисте и он решил защитить его от ошибок в отдельно взятом случае. Так сказать спас нас от граблей. Причем — это привело к куче других граблей. Не виртуальность конструктора это еще фигня. А вот не виртуальность виртуального деструктора — это еще та песьня.
что это такое (не виртуальность виртуального деструктора) ?
это ты про то, как виртуальные методы из деструктора вызываются ?
VD>Вторая просто читает о них на форума (орлов заучивших стандарт наизусть в рассчет не берем, ибо мало их). В Шарпе кострукторы и финалайзеры могут быть виртуальными. Это конечно потенциально опасно, но за-то совершенно логично. Я еще ни разу не встречал случаев наступания на эти грабли. А язык от этого получается концептуально стройным.
а как реализуются виртуальные конструкторы в шарпе ?
это уже интересно
(имхо оттуда пол-шага до сабжа)
VD>В форуме по С++ мы как то обсуждали эту проблему, и я предложил полноценное решение. Разбивать конструкторы и деструкторы на Before и After. Тогда можно будет иметь и место где перед уничтожением/созданием экземпляра можно произвести витруальный вызов (в полнос соотвествии с ОО-концепциями), и место строгих-пре(под)-действий.
ну, это уже перебор
вызов inherited из нужного места проще воспринимается
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, Serginio1, Вы писали:
AVK>>>Нет, я хочу сказать что когда мы имеем задачу в целом то оказывается что никакой выгоды от метаклассов практически нет. В Дельфи все тоже красиво на бумаге, а вот когда смотрим на реализацию и внешние условия то все становится далеко не так шоколадно.
S>>Если Type расширить до метакласса то все получится шоколадно.
AVK>Ничего шоколадног не получится. Ты как этот Type получать собираешься? typeof? Смысла никакого нет. object.GetType()? Но он же нетипизированный, а значит результат ничем не лучше атрибутов. Assembly.GetTypes — та же фигня? Type.GetType() — и тут тоже самое. Метаклассы не избавляют от приведения, они их выносят в другое место.
Если объект наследник от базового типа, то приводится он к базовому типу метакласса.
А вот все его методы и данные будут конкретного класса. Так кстати и в Delphi, но только к методам. S>> Посмотрим как на эту проблему, а может не проблему отреагируют создатели.
AVK>Я тебе сразу скажу — никак.
Я бы сказал процентов на 90%. Досадно, но ладно. Просто подход с метакласссами просто красив, а в некоторых случаях и очень полезен. S>>Если будет то удобно, если нет то и сишники безболезненно живут до сих пор,
AVK>Ну я бы не сказал что безболезненно.
S>> хотя и они признают полезность метаклассов, виртуальных статических методов и данных.
AVK>Вот именно что признают.
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, s.ts, Вы писали:
ST>как можно попроще реализовать статические виртуальные методы для класса (не городя фабрик и т.п.) на С# ? ST>поделитесь плз. у кого какие идеи по этому поводу ?
Никак ST>вообще как это должно выглядеть по-нормальному ?
По-нормальному, вот такому коду на Delphi
type
TBase = class
constructor Create(param: integer); virtual;
class function A: integer; virtual;
function B: integer; virtual;
end;
TBaseClass = class of TBase;
TDerived = class(TBase);
constructor Create(param: integer); override;
class function A: integer; override;
function B: integer; override;
end;
соответстует примерно такой код на C#:
class Base
{
public virtual int B() {...};
public Base(int param) {...};
}
class BaseClass
{
public static BaseClass _bc { get {...}}
public virtual Base Create(int param) { return new Base(param);}
public virtual int A() { }
}
class Derived : Base
{
public Derived(param) {...};
public override int B() {...};
}
class DerivedClass : BaseClass
{
public static DerivedClass _dc {get {}}
public override Base Create(int param) { return new Derived(param);}
public override int A() {...};
}
тогда вот такой код на Delphi:
var
ClassVar: TBaseClass;
ObjectVar: TBase;
begin
ClassVar:= TBase;
ObjectVar:= ClassVar.Create(ClassVar.A);
ClassVar:= TDerived;
ObjectVar:= ClassVar.Create(ObjectVar.B);
Разница, которую преодолеть в рамках .Net пока нельзя, состоит в следующем: 1. Во всех фабриках метод Create имеет один и тот же набор параметров. Это означает, что и тип возвращаемого значения у него всегда фиксирован. Поэтому вот такой код на C# невозможен:
var
ObjectVar: TDerived;
begin
ObjectVar = TDerived.Create(0);
К счастью, виртуальных класс-методов это не касается. 2. Тело метода Create для всех потомков Base известно совершенно точно. В С# его придется писать руками, что чревато ошибками (особенно с учетом Cut'n'paste). Дженерики, насколько мне известно, ситуацию не спасут. 3. Вот так навскидку следующий код:
function GetSome(TBase o): integer;
begin
result:= o.B+o.A;
end;
я на C# перевести затрудняюсь.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
AVK>Ну то есть из рефлекшена. В таком разе про типобезопасность и производительность можно забыть, все равно ковыряться в метаданных и явно приводить придется. Тут как — сказал а, говори б. Если мы имеем возможность виртуальности метаданных значит мы должны иметь и типизированный способ получения этих типов, так ведь?
Не согласен с тем, что "сказал а — говори б". Все-таки источников данных все-таки есть три:
* явная сслка на конкретный тип
* вытаскивание типа из экземпляра
* все остальное, пожалуй можно отнести к рефлекшену.
Понимаешь, если выбирать между (10% рефлекшена + 90% не-рефлекшена) и (100% рефлекшена), то я выберу первое.
И другому посоветую, потому что 90% кода будет лучше. Это тоже плюс. Производительность — это же не беременность
AVK>Ну вполне возможно что в каких то случаях да. Вопрос только в каких. Это я и пытаюсь выяснить, а вы упорно приводите решения частных задач. Вот к примеру нафига мне знать количество таблиц в типизированном датасете, если практически наверняка я буду писать механику для любых датасетов. Соответственно я не могу полагаться на то что эта информация общая для всего типа.
Я не очень понял насчет "механики для любых датасетов". Но пример с датасетами я привел не совсем от балды — я недавно использовал большое кол-во строго типизированных потомков DataTable с общим корнем. Была нужна как раз общая статическая информация — маппинг на базу, ассоциации с другими классами, информация о колонках.
Делал атрибутами. И хорошо представляю, что это такое. Причем эту информацию действительно не всегда можно было получить из экземпляра. Вот тут у меня руки и чесались использовать виртуальные статические члены с этой метаинформацией.
AVK>Я ведь не зря привел PG. Это задачка очень широко использующая метаданные. Там есть очень много возможных применений метаинформации. ВОт и скажи мне — какую часть всей этой механики можно было бы упростить при наличии статических виртуальных методов.
С PG пример тебе на руку, потому что он работает с принципиально разнотипными объектами
Давай, если уж захотелось поговорить о том, как можно было бы переделать стандартные вещи, рассмотрим другое -перечисления например.
Хочу я перечислить например KnownColors или узнать элемент по названию:
foreach (KnownColors c in Enum.GetValues(typeof(KnownColors)))
Console.WriteLine(c);
...
KnownColors c = Enum.GetName(typeof(KnownColors), "Aqua")
Как это могло бы быть замечательно переписано?
foreach (KnownColors c in KnownColors)
Console.WriteLine(c);
...
KnownColors c = KnownColors["Aqua"]
По-моему это уже неплохо! Хотя и требует static IEnumerable. На досуге еще поищу — как чего можно было бы переписать — просто для иллюстрации.
iT>>Да, атрибутами можно сделать гибче. Но далеко не всегда проще, удобнее, быстрее и надежнее. И что жаль, что такого механизма нет в clr — он бы никому не помешал, а только помог бы.
AVK>Знаешь, в clr много чего есть. Всегда следует рассматривать обе стороны монеты. Не только полезные но и вредные. И почему кстати останавливаться именно на этом уровне? Как только мы вводим типизированные варианты метаклассов (а ты, помнится, еще и интерфейсы предлагал) то сразу появится необходимость метаинформации об этих самых метаклассах. И так до бесконечности можно раскручиваться. По мне так куда логичнее не мешать ООП модель и метаданные, а сделать их перпендикулярными друг другу, т.е. метаданные описывают ООП модель, но при этом не являются ее частью. Если задуматься то эта мысль является реинкарнацией идеи об отделении контента от представления.
Ну, естественно, до абсурда доводить не стоит. Просто, ИМХО, существующая модель — это не два, а полтора измерения Одно — экземпляры, а половинка — типы Средствами языка обратиться виртуально к члену экземпляра — можно, а к члену типа — нельзя.
AVK>В данном случае нет, так как вопрос не в еще одной конструкции, а в концептуальном изменении языка.
Я не уверен на 100%, что понимаю все последствия (вот, страуструп тоже не понимал, к чему приведут шаблоны ) но мне кажется, что изменения были бы не так уж и серьезны. Обратная совместимость — практически полная — typeof() возвращает потомка System.Type, а значит, он ведет себя как System.Type, но на самом деле это SomeAncestorType : SomeParentType : System.Type.
iT>>Или тебе необходимо именно обоснование, почему нужна статическая виртуальная информация о типе? AVK>Нет, мне нужно обоснование почему она при этом должна являться частью той же самой ООП модели что и собственно классы.
Да просто потому что это вытекает из того, что уже есть. ИМХО. конечно, но все-таки она вытекает!
AVK>Можно, но при этом компилятору пришлось бы создавать экземпляры атрибутов в процессе компиляции.
Ммм.. а AttributeUsage он анализирует на более низком уровне compiler magic, да?
Ну что-ж, согласен. Тут особый случай — это компилятор разбирает.
Ну вон, там выше про enum есть, может еще чего интересненькое придумаю — скажу
VD>Ну, тогда нет пробем выбрости свой virtual и будет тоже самое. virtual здесь никаким боком не упал.
Ну, ты просто все-таки не въехал
Без virtual это работать никак не будет А точнее, будет работать только со ссылкой на конкретный тип, а не на абстрактный.
Здравствуйте, mihailik, Вы писали:
S>>Но при этом с использовать метакласс намного удобнее быстрее и типизированно чем Type.
M>Ну и замечательно. Я бы тоже так делал в некоторых случаях. Согласен.
M>Но зачем ты хотел на каждый объект создавать отдельный экземпляр этого самого метакласса — не вдупляю ну никак
Я такого не говорил. А говорил только о создании объекта из метакласса, а не из Type или делегатов из за неизвестности типа, но по какомуто внутреннему TypeID в БД можно создать массив или хэш таблицу метаклассов ассоциируемую с конкретным TypeID. Так как метаклассы уже созданы то мне легче засунуть туда их и создавать оттуда объекты.
А созданий объектов может доходить и до десятков миллионов. Только и всего.
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, VladD2, Вы писали:
VD>Митона не знаю. Знаю только что это махровый интерпретатор с никакой производительностью по сарвению с компилируемыми средами.
VD>Так что еще раз приходим к выводу — на лицо неумение группы бывших дельфистов спокойно принимать другие технологии.
Ты знаешь — я бы не ввязался в спор, если бы перед этим не накушался атрибутами по самое нехочу. То есть я "принял" технологию и старался ее использовать там, где она нужна — для расширения метаданных. И понял, что это далеко не так вкусно, как вы тут описываете. Один атрибут — да. Два — пожалуй. Десять, которые нужны в нескольких местах — и начинается убогое копирование кода. Естественно, был написан helper для извлечения атрибутов — иначе кода было бы еще в три раза больше. Но кардинально ситуацию он не исправляет.
Извини, но я хочу вместо
TableCountAttribute tca = (TableCountAttribute)AttributeHelper.GetSingleAttribute(dataSetType, typeof(TableCountAttribute));
if (tca == null)
throw new MetadataException("Attribute TableCountAttribute not found");
return tca.TableCount;
писать просто
return dataSetType.TableCount;
и не хотеть этого меня врядли кто-то заставит.
Увы, но заявления о том, что настоящие кул-программеры предпочтут первый вариант я тоже за серьезные принять не могу
да, правда, не подумал. "Ошарпился" вконец. первая строка гораздо проще должна быть.
Никаких typeof. iT>>
iT>>tableCount = AnyDataSetType.TableCount;
iT>>
Это наглядно показывает, как опыт тесного общения с языком, в котором отсутствуют какие-то возможности, корректирует наше мышление таким образом, что мы эти возможности перестаем воспринимать, мы их не замечаем, обходимся без них и потом кричим "нафиг надо?".
Здравствуйте, mihailik, Вы писали:
M>>>Ну только не говори, что они на каждый объект они свой тип создают.
ST>>а м.б. на каждый тип свой объект ?
M>Это как раз нормально, Type и есть один объект на тип.
M>А Serginio почему-то хочет ещё и типы создавать почаще. Или я его не понял. Или он сам не знает чего хочет.
Вот именно что не понял. Я как раз не хочу создавать метаклассы, а из них создавать объекти типа ассоциированных с этим метаклассом.
Еще раз. Есть БД. Есть классы ассоциированные с талицей (ми). Есть поля которые могут иметь неопределенный тип. Для них поле имеет вид
struct HerEgoZnaetType
{
int TypeID;
int ID;
}
По TypeID я должен найти соответствующий класс вызвать конструктор, передать ID что бы он загрузил данные из БД.
В Delphi это решается просто.
Есть базовый класс, и есть классы порожденные от него.
TBDClass= class ob TBDClasses;
Я строю массив TBDClass[] DB, или DB: Array of TBDClass; и прописываю значения этих метаклассов
Например
BD[0]=СправочникНоменклатура;
BD[1]=ДокументПриходнаяНакладная;
итд
И если мне надо создать объект
То object:=bd[TypeId].Create(ID)
Может еще поподробнее объяснить?????
и солнце б утром не вставало, когда бы не было меня
S> Еще раз. Есть БД. Есть классы ассоциированные с талицей (ми). Есть поля которые могут иметь неопределенный тип. Для них поле имеет вид S>struct HerEgoZnaetType S>{ S> int TypeID; S> int ID; S>}
Очень хорошо понял. Отлично, и на C# и на Дельфи это делается легко, фабрики классов.
Просто в Дельфи эта функциональность встроена в язык, но чтобы это было чем-то сверхгениальным или сверхнеобходимым так нет.
Здравствуйте, mihailik, Вы писали:
S>> Еще раз. Есть БД. Есть классы ассоциированные с талицей (ми). Есть поля которые могут иметь неопределенный тип. Для них поле имеет вид S>>struct HerEgoZnaetType S>>{ S>> int TypeID; S>> int ID; S>>}
M>Очень хорошо понял. Отлично, и на C# и на Дельфи это делается легко, фабрики классов.
M>Просто в Дельфи эта функциональность встроена в язык, но чтобы это было чем-то сверхгениальным или сверхнеобходимым так нет.
А как насчет спицфиских данных о типе??? Я получаю не только объект, но данные класса. Иногда и конструктор вызывать не надо, а просто получить данные но очень быстро через виртуальные статические методы (наверное в 20 раз повторюсь но еще желательно и данные в Delphi этого нет, вернее можно через методы получить некоторые заранее инициализированные переменные или массив статические данные, т.к. структура одинакова, но данные разные, но это неудобно хотелось бы что бы они хранились в самом метаклассе), т.к. наследуются они от одного предка . Да и фабрику классов делать абсолютно нет никакого желания, 400 классов.
Все можно сделать, только в одних случаях это намного удобнее и красивее.
и солнце б утром не вставало, когда бы не было меня
S> Иногда и конструктор вызывать не надо, а просто получить данные но очень быстро через
Но почему обязательно "через"?
Ты хочешь получить данные по ID типа — ну так и получай и храни их по ID. Это будет раза в два быстрее, чем лепить тип, вызывать эту самодельную виртуальность.
В общем, я думаю, мы друг друга поняли. Статическая виртуальность сама по себе интересная фича, но в C# её нет и это нормально. Гуд?
Здравствуйте, mihailik, Вы писали:
S>> Иногда и конструктор вызывать не надо, а просто получить данные но очень быстро через
M>Но почему обязательно "через"?
M>Ты хочешь получить данные по ID типа — ну так и получай и храни их по ID. Это будет раза в два быстрее, чем лепить тип, вызывать эту самодельную виртуальность.
А ее и лепить не надо. Нашел метакласс а там и данные и конструкторы. Очень удобно.
И почему это Type виртуальный??? M>В общем, я думаю, мы друг друга поняли. Статическая виртуальность сама по себе интересная фича, но в C# её нет и это нормально. Гуд?
Может и введут в Net, а от Дельфевой реализации прок есть, но очень маленький от того как возможно. Еще не вечер. Хотя и вероятность этого очень очень мала.
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Igor Trofimov, Вы писали:
VD>>Ну, тогда нет пробем выбрости свой virtual и будет тоже самое. virtual здесь никаким боком не упал.
iT>Ну, ты просто все-таки не въехал iT>Без virtual это работать никак не будет А точнее, будет работать только со ссылкой на конкретный тип, а не на абстрактный.
Объясни, что тебе здесь дает виртуальность?
abstract class DataSet // это базовый тип
{
static virtual int TableCount { get; }
}
class CustomerDataSet : DataSet // это конкретный потомок
{
static override int TableCount { return 10; }
}
Чтобы это имело какой-то смысл, то нужно чтобы под DataSet как-то мог скрываться CustomerDataSet, и при вызове DataSet.TableCount реально происходил вызов CustomerDataSet.TableCount. Но я не представляю себе как под DataSet может скрываться CustomerDataSet, а ты себе это как представляешь?
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, Serginio1, Вы писали:
AVK>>>Ты никак не хочешь понять одну простую вещь — обращение к метаданным много миллионов раз, неважно откуда с полным их перечитыванием это ошибка дизайна.
S>> Это ты не понимаешь. Я уже устал тебе перечислять все варианты.
AVK>А что мне твои варианты? Это варианты внутри тобой разработанного дизайна. Если такое вылазит и нормально решить проблему никак значит надо искать проблемы в дизайне. Если дизайн нормален то там не должно быть обращения к одним и тем же данным много миллионов раз, особенно если это метаданные. Явный оверхед.
Ну ты глупостей то не говори. Весь нет на боксинге и унбоксинге построен, а Type это тот же метакласс только сильно усеченный. Плохой дизайн??? Согласен.
И дженерики не во всем помогут. Так в любом случае при типе поля object или базового класса деваться некуда .
S>> И прежде всего это связано с неопределенным типом объектов, но имеющих единую иерархию. В том, что добиться полной типизации невозможно хоть с этим ты согласен ????
AVK>Согласен. Хуже того — полной типизации невозможно добиться и в Дельфовом варианте. Вот кстати интересно — а дженерик атрибуты допустимы?
Надо будет посмотреть. S>>>> Обычно все данные связанные с классом тянут на объект увеличивая его размер, но увиличивая скорость доступа.
AVK>>>Не знаю, я таких решений что то не встречал. Обычно это в твоем коде?
S>> А ну да
AVK>Ну тогда это не обычно, а у тебя
Не уменя а у M$. Ты помоему что то опустил????
и солнце б утром не вставало, когда бы не было меня
U>Чтобы это имело какой-то смысл, то нужно чтобы под DataSet как-то мог скрываться CustomerDataSet, и при вызове DataSet.TableCount реально происходил вызов CustomerDataSet.TableCount. Но я не представляю себе как под DataSet может скрываться CustomerDataSet, а ты себе это как представляешь?
Вот по-видимому, много кто не представляет. И очень зря.
Как у тебя под ссылкой на экземпляр DataSet скрывается экземпляр CustomerDataSet, так и под ссылкой на тип DataSet может скрываться тип CustomerDataSet. Все просто.
Здравствуйте, Igor Trofimov, Вы писали:
U>>Чтобы это имело какой-то смысл, то нужно чтобы под DataSet как-то мог скрываться CustomerDataSet, и при вызове DataSet.TableCount реально происходил вызов CustomerDataSet.TableCount. Но я не представляю себе как под DataSet может скрываться CustomerDataSet, а ты себе это как представляешь?
iT>Вот по-видимому, много кто не представляет. И очень зря.
iT>Как у тебя под ссылкой на экземпляр DataSet скрывается экземпляр CustomerDataSet, так и под ссылкой на тип DataSet может скрываться тип CustomerDataSet. Все просто.
iT>>Как у тебя под ссылкой на экземпляр DataSet скрывается экземпляр CustomerDataSet, так и под ссылкой на тип DataSet может скрываться тип CustomerDataSet. Все просто.
U>А синтаксис этого скрытия какой?
Ты о чем? В шарпе этого нету, так что гипотетически синтаксис подобной штуки может быть любой.
Здравствуйте, Igor Trofimov, Вы писали:
iT>>>Как у тебя под ссылкой на экземпляр DataSet скрывается экземпляр CustomerDataSet, так и под ссылкой на тип DataSet может скрываться тип CustomerDataSet. Все просто.
U>>А синтаксис этого скрытия какой?
iT>Ты о чем? В шарпе этого нету, так что гипотетически синтаксис подобной штуки может быть любой.
Дык ты и напиши свой вариант гипотетического синтаксиса.
U>Дык ты и напиши свой вариант гипотетического синтаксиса.
Собственно, изменение в синтаксисе нужно только одно — для объявления ссылки на некоторый подтип.
При том, C# старается использовать все по месту и нигде не объявлять типы отдельно от определения, то Delphi-вариант с предварительным объявлением "type DataSetType = class of DataSet;" не очень подходит.
Может как-нибудь так DoSomething(typeof(DataSet) t) ?
физически это транслировалось бы в DoSomething(DataSetType t), где DataSetType потомок Type.
Здравствуйте, Igor Trofimov, Вы писали:
iT>Собственно, изменение в синтаксисе нужно только одно — для объявления ссылки на некоторый подтип.
iT>При том, C# старается использовать все по месту и нигде не объявлять типы отдельно от определения, то Delphi-вариант с предварительным объявлением "type DataSetType = class of DataSet;" не очень подходит.
iT>Может как-нибудь так DoSomething(typeof(DataSet) t) ?
iT>физически это транслировалось бы в DoSomething(DataSetType t), где DataSetType потомок Type.
Наконец-то понял, как это можно использовать. В принципе довольно красивая фича, хотя сомневаюсь, что шибко нужная.
Здравствуйте, Igor Trofimov, Вы писали:
iT>Ну, ты просто все-таки не въехал iT>Без virtual это работать никак не будет А точнее, будет работать только со ссылкой на конкретный тип, а не на абстрактный.
А как у абстрактного типа могут быть конкретные метаданные? Или у нас количество таблиц неотемлемая часть любого класса?
... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Serginio1, Вы писали:
S> Да разговор вобщето не о Delphi. Там как раз нельзя хранить данные класса в метаклассе.
Нда.
S>Тоесть есть иерархия классов у которых структура данных одинакова но по содержимому разная. Причем доступ к этим данным должен быть быстрым.
Ты вообще о чем? В общем, опять абстрактные разговоры о ложке которой на самом деле нет.
S> Виртуальные метаклассы вполне способны решить эту проблему причем ссылка на него должна быть в VMT.
Зачем? Есть обычные классы. Чем они не подходят? Нужен один экземпляр — сделай синглтон.
... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Igor Trofimov, Вы писали:
iT>Извини, но я хочу вместо iT>
iT>TableCountAttribute tca = (TableCountAttribute)AttributeHelper.GetSingleAttribute(dataSetType, typeof(TableCountAttribute));
iT>if (tca == null)
iT> throw new MetadataException("Attribute TableCountAttribute not found");
iT>return tca.TableCount;
iT>
iT>писать просто iT>
iT>return dataSetType.TableCount;
iT>
iT>и не хотеть этого меня врядли кто-то заставит.
iT>Увы, но заявления о том, что настоящие кул-программеры предпочтут первый вариант я тоже за серьезные принять не могу
Т.е. у тебя не удается создать метод или класс ктотый обеспечит тебе достойную инкапсуляцию?
А причем тут язык?
... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Igor Trofimov, Вы писали:
iT>Это наглядно показывает, как опыт тесного общения с языком, в котором отсутствуют какие-то возможности, корректирует наше мышление таким образом, что мы эти возможности перестаем воспринимать, мы их не замечаем, обходимся без них и потом кричим "нафиг надо?".
Все это наглядно показывает, что никакие супер-пупер современные и гибкие средства не заменят умения решать проблемы имеющимися методами.
Погляди на хоум. Там на атрибутах сделано очень много. Причем обычно вообще не нужно писать лишнего кода. Пометил что-нить атрибутом и все само работает.
Для решения твоей проблемы вообще атрибуты не нужны. Нуж всего лишь создать один класс-обертку которая считает нужные данные, закэшурует их и предоставит удобный интерфейс.
Что же касается магического "AnyDataSetType.TableCount" то на дельфи ты его тоже не плучишь.
Сгерерируй датасет, подцепи его на Дельфи 8 и попробуй.
... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Lloyd, Вы писали:
VD>>Митона не знаю. Знаю только что это махровый интерпретатор с никакой производительностью по сарвению с компилируемыми средами.
L>Пастернака не читал, но осуждаю. Клоун.
Я всегда это за тобой замечал.
Что же касается интерпретаторов, то можешь попробовать доказать обратное. Люблы посмеяться знаете ли.
... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Igor Trofimov, Вы писали:
iT>Оттуда же, откуда ты написал бы атрибут DataTableCountAttribute со значением 10. Конкретный тип знает это про себя.
А какой смысл вручную такие вещи вписывать?
Тогда уж нет особых проблем создать базовый тип атрибута разместить все что нужно в нем. А потом создать мелкий хэлпер который вынет тебе нужную информацию.
AVK>>Пока что твой код абсолютно бессмысленен с практической точки зрения.
iT>) Ну это же пример. Ты всегда критикуешь за практическую неприменимость примеры подходов?
Я вижу надуманность этого пимера.
... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Igor Trofimov, Вы писали:
iT>Да откуда угодно. Например, при перечислении всех типов — потомков DataSet. Или из настройки/из БД. iT>Если ты хочешь мне сказать, что раз там уже знают конкретный тип, то значит, там точно знают число таблиц, то будешь неправ. Я тогда по аналогии могу сказать про виртуальные методы экземпляра — изначально объект где-то создается, там точно знают конкретный тип, вот путь и вызывают SaveCustomer() вместо virtual Save().
Блин, да на то он и экземпляр! Ты же хочешь не метаданные, а параллельной релизации ОО-фич для статической части класса. Одним словаом переворачивашь все концепции ООП. И все это вместо того чтобы просто создать синглтон.
Когда ты приводишь конкретные задачи, то тебе дают конкретные решения. Недавно ты мне тут говорил, что я не смогу вынуть число таблиц из типизированного датасета. Я тебе его вынул (бросил все и занялся поной фигней). Теперь ты утверждаешь что мол некрасиво это, кода много. Ну, напишу я тебе инкапсуляцию этого даела до одной функции, и что? Да ты скажешь, что это все фигня хочу быть царицою морскою.
... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, s.ts, Вы писали:
ST>но его можно перегрузить для класса
Именно что перегрузить. Он все равно будет статическим и оператором.
ST>что это такое (не виртуальность виртуального деструктора) ?
Ну, я же говорю не нахлебался ты С++ по самые уши.
ST>это ты про то, как виртуальные методы из деструктора вызываются ?
И про наличие ключевого слова virtual у деструктора. Приходит очередной мэн в С++ пишет:
struct A
{
virtual void Clinup()
{
printf("A::Clinup()\n");
}
virtual ~A()
{
Clinup();
}
};
struct B : public A
{
virtual void Clinup()
{
/* опа... айда на форум RSDN C++ :) */
printf("B::Clinup()\n");
}
};
ST>а как реализуются виртуальные конструкторы в шарпе ? ST>это уже интересно ST>(имхо оттуда пол-шага до сабжа)
Так же как и любой другой виртуальный метод. В нем уже сформирована VMT и можно производить виртуальные вызовы.
Грабли могут быть в том, что нужно четко понимать, что этот вызов будет сделан до вызова конструкторов сабклассов.
Но так как в отличии от плюсов Шарп гарантирует инициализацию нулями, то и проблем не происходит.
ST>ну, это уже перебор ST>вызов inherited из нужного места проще воспринимается
Это тоже обсуждали. Это перенос отвественности на человека. А это самый безотвественный и ненадежный компнент в системе.
... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Serginio1, Вы писали:
AVK>>А что мне твои варианты? Это варианты внутри тобой разработанного дизайна. Если такое вылазит и нормально решить проблему никак значит надо искать проблемы в дизайне. Если дизайн нормален то там не должно быть обращения к одним и тем же данным много миллионов раз, особенно если это метаданные. Явный оверхед. S> S> Ну ты глупостей то не говори. Весь нет на боксинге и унбоксинге построен,
При чем тут боксинг? Да и утверждать что весь дотнет построен на боксинге мягко говоря не стоит.
S>>>>> Обычно все данные связанные с классом тянут на объект увеличивая его размер, но увиличивая скорость доступа.
AVK>>>>Не знаю, я таких решений что то не встречал. Обычно это в твоем коде?
S>>> А ну да
AVK>>Ну тогда это не обычно, а у тебя S> Не уменя а у M$. Ты помоему что то опустил????
Здравствуйте, Igor Trofimov, Вы писали:
iT>Ты знаешь — я бы не ввязался в спор, если бы перед этим не накушался атрибутами по самое нехочу. То есть я "принял" технологию и старался ее использовать там, где она нужна — для расширения метаданных. И понял, что это далеко не так вкусно, как вы тут описываете. Один атрибут — да. Два — пожалуй. Десять, которые нужны в нескольких местах — и начинается убогое копирование кода.
iT>Не согласен с тем, что "сказал а — говори б". Все-таки источников данных все-таки есть три: iT>* явная сслка на конкретный тип iT>* вытаскивание типа из экземпляра iT>* все остальное, пожалуй можно отнести к рефлекшену.
Вот о том и речь. В первом варианте полиморфизм ничего не дает, мы и так конкретный тип знаем, во втором и в шарпе все виртуально, в третьем ни о какой типобезопасности речь не идет.
iT>И другому посоветую, потому что 90% кода будет лучше. Это тоже плюс. Производительность — это же не беременность
По поводу производительности я уже говорил. Работа с метаданными это не то место где производительность главный лимитирующий фактор. Построение в памяти структур на основе метаданных занимает небольшое время даже для приличных сборок. Все действия сверх того являются следствием ошибочного дизайна.
iT>Я не очень понял насчет "механики для любых датасетов".
А что тут непонятного? Сами по себе метаданные не представляют никакой ценности (ну разве что для каких то девелоперских тулзов). Ценность представляют экземпляры и прикладной код работает прежде всего с экземплярами. А при наличии экземпляра вполне полиморфно можно получить его тип.
iT> Но пример с датасетами я привел не совсем от балды — я недавно использовал большое кол-во строго типизированных потомков DataTable с общим корнем. Была нужна как раз общая статическая информация — маппинг на базу, ассоциации с другими классами, информация о колонках.
Ну тогда тебе стоит поглядеть на Rsdn.Framework.Data.
iT>Делал атрибутами. И хорошо представляю, что это такое.
Ты считаешь что я не представляю? Опять приведу тебе пример PG. Мне так кажется что объем кастомной информации, которую он может потреблять, особенно совместно с хостом, заметно побольше твоей задачки. Тем не менее никакого жуткого копирования кода не наблюдается. Почему так?
iT>С PG пример тебе на руку, потому что он работает с принципиально разнотипными объектами
Что значит принципиально разнотипными? Он работает прежде всего с потомками object. А многие фичи дизайнера начинают работать только если ты реализуешь IComponent. Разнотипность объектов это следствие иного подхода, а не его причина. Разнотипность только все усложняет. Если даже в сложных условиях подход дотнета ведет себя неплохо, то почему ты ожидаешь что при упрощении условий он станет работать хуже?
iT>По-моему это уже неплохо! Хотя и требует static IEnumerable. На досуге еще поищу — как чего можно было бы переписать — просто для иллюстрации.
А при чем тут виртуальные статические методы?
iT>Ну, естественно, до абсурда доводить не стоит.
А почему ты считаешь что именно в Дельфи самая неабсурдная модель? Да, у нее есть определенные преимущества, но есть и определенные недостатки. Попытки же реализовать сразу несколько подходов, как показывает практика, приводят к печальным результатам.
iT> Просто, ИМХО, существующая модель — это не два, а полтора измерения Одно — экземпляры, а половинка — типы
Существующая модель это честные два измерения, а вот модель Дельфи это не два измерения, а полтора, т.к. векторы ООП и метаданных не перпендикулярны, а коррелируют между собой. Как следствие — уменьшение пространства возможных решений, т.е. снижение гибкости
iT>Я не уверен на 100%, что понимаю все последствия
Зато я уверен что и ты и я не понимаем все последствия . Кардинальные модификации языка это очень большое исследование.
iT> (вот, страуструп тоже не понимал, к чему приведут шаблоны ) но мне кажется, что изменения были бы не так уж и серьезны.
Тут я с тобой не согласен. Тут вот недавно человек тоже считал что добавление кода в интерфейсы серьезных последствий не вызовет. Здесь та же история. Необходимость статической виртуальности тут же вызовет необходимость статической VMT. А это уже усложнение JIT. Причем это то что лежит на поверхности. А если копнуть глубже то все становится еще печальнее. Каким образом например на СВ должен вести себя ремоутинг при передаче по ссылке и по значению?
AVK>>Нет, мне нужно обоснование почему она при этом должна являться частью той же самой ООП модели что и собственно классы.
iT>Да просто потому что это вытекает из того, что уже есть. ИМХО. конечно, но все-таки она вытекает!
Вот тут то я с тобой и не согласен. Если говорить об идеологической чистоте, то попытка совместить модель данных и метаданных приводит к той самой рекурсии. Понятно что нужно где то эту рекурсию чисто исскуственно обрубить, но при этом ни о какой логичности уже речи не идет.
AVK>>Можно, но при этом компилятору пришлось бы создавать экземпляры атрибутов в процессе компиляции. iT>Ммм.. а AttributeUsage он анализирует на более низком уровне compiler magic, да?
Ага. В этом правиле есть одно исключение правда, какое не скажу , но оно своими глюками только подтверждает правило.
Здравствуйте, Serginio1, Вы писали:
AVK>>Ничего шоколадног не получится. Ты как этот Type получать собираешься? typeof? Смысла никакого нет. object.GetType()? Но он же нетипизированный, а значит результат ничем не лучше атрибутов. Assembly.GetTypes — та же фигня? Type.GetType() — и тут тоже самое. Метаклассы не избавляют от приведения, они их выносят в другое место.
S> Если объект наследник от базового типа, то приводится он к базовому типу метакласса.
Ну пойми ты одну простую вещь. Это в случае экземпляров пространство их полностью неопределено. С типами все понятно уже при компиляции, пространство их известно. Конечно остается ситуация неизвестных при компиляции сборок и тут определенный бенефит от того что вы хотите имеется, но малочисленность самих сущностей позволяет нам производить практически любую надстройку. Т.е. к примеру сравнительно небольшими усилиями можно написать библиотечку, строящую эти самые метаклассы при загрузке сборки на основании рефлекшена и атрибутов.
Здравствуйте, VladD2, Вы писали:
VD>Я всегда это за тобой замечал.
VD>Что же касается интерпретаторов, то можешь попробовать доказать обратное. Люблы посмеяться знаете ли.
Тебе чего-то доказывать? Низачто. Ты же фанатик, тебя аргументы не пронимают.
Здравствуйте, VladD2, Вы писали:
ST>>что это такое (не виртуальность виртуального деструктора) ?
VD>Ну, я же говорю не нахлебался ты С++ по самые уши.
не любитель я, знаешь ли, хлебать всякое ...
просто берешь книжку и читаешь, читаешь, читаешь...
идешь на форум и срашиваешь чего не понял...
это все до того, как всякие умные свои идеи реализовывать
очередной раз предлагаю обойтись без взаимных оценок
я когда своего страуструпа читал, он был в тонкой обложке из 200 страниц (1 или 2-е издание уж не помню)
ST>>это ты про то, как виртуальные методы из деструктора вызываются ?
VD>И про наличие ключевого слова virtual у деструктора. Приходит очередной мэн в С++ пишет: VD>
VD>struct A
VD>{
VD> virtual void Clinup()
VD> {
VD> printf("A::Clinup()\n");
VD> }
VD> virtual ~A()
VD> {
VD> Clinup();
VD> }
VD>};
VD>struct B : public A
VD>{
VD> virtual void Clinup()
VD> {
VD> /* опа... айда на форум RSDN C++ :) */
VD> printf("B::Clinup()\n");
VD> }
VD>};
VD>
ну... собственно, это нужно знать, как и синтаксис...
сейчас почему-то считается, что не нужно знать даже синтаксис, который не используешь
на самом деле все связано: автоинициализация полей/автовызов конструктора предка/"невиртуальность виртуальных функций" это должно быть так, как в C++ или наоборот, третьего не дано
если, например, убрать "невиртуальность", то, чтобы граблей (настоящих, а не тех, что по незнанию) избежать, придется автоинициализацию вводить и т.д. — тут одно другое тянет
как раз-таки я цэ нахлебался и теперь очень рад той же дельфе, хотя изначально плевался и конструкторы базового класса забывал вызывать...
ST>>а как реализуются виртуальные конструкторы в шарпе ? ST>>это уже интересно ST>>(имхо оттуда пол-шага до сабжа)
VD>Так же как и любой другой виртуальный метод. В нем уже сформирована VMT и можно производить виртуальные вызовы.
а, ты про это...
VD>Грабли могут быть в том, что нужно четко понимать, что этот вызов будет сделан до вызова конструкторов сабклассов.
VD>Но так как в отличии от плюсов Шарп гарантирует инициализацию нулями, то и проблем не происходит.
ага (выше я то же самое писал), а можно было не делать автоинициализацию, но убрать автовызов базового конструктора. и потом (как си плюсплюсники) кричать, что это дает могучую эффективность создаваемых приложений при "совсем небольшом ручном кодировании"
проблемы-то все равно будут, но они легко обходятся (в дельфе даже есть спецовый флажок в ComponentState под названием csDestroying) всякими там флажками, да декомпозицией
ST>>ну, это уже перебор ST>>вызов inherited из нужного места проще воспринимается
VD>Это тоже обсуждали. Это перенос отвественности на человека. А это самый безотвественный и ненадежный компнент в системе.
да нет, дело привычки (см. выше)
но если приходится часто переключаться между языками, где все по-разному, то да...
я вот вечно с индексацией массивов путался, а после долгописания на паскале еще и с операторами присваивания/сравнения. хорошо, что шарп это сечет четко. а вот в сях — фигня выходит ... мнда...
p.s. кстати, "самым безответственным и ненадежным компонентом" моей системы оказался борланд со своим кликсом
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, Serginio1, Вы писали:
AVK>>>Ничего шоколадног не получится. Ты как этот Type получать собираешься? typeof? Смысла никакого нет. object.GetType()? Но он же нетипизированный, а значит результат ничем не лучше атрибутов. Assembly.GetTypes — та же фигня? Type.GetType() — и тут тоже самое. Метаклассы не избавляют от приведения, они их выносят в другое место.
S>> Если объект наследник от базового типа, то приводится он к базовому типу метакласса.
AVK>Ну пойми ты одну простую вещь. Это в случае экземпляров пространство их полностью неопределено. С типами все понятно уже при компиляции, пространство их известно. Конечно остается ситуация неизвестных при компиляции сборок и тут определенный бенефит от того что вы хотите имеется, но малочисленность самих сущностей позволяет нам производить практически любую надстройку. Т.е. к примеру сравнительно небольшими усилиями можно написать библиотечку, строящую эти самые метаклассы при загрузке сборки на основании рефлекшена и атрибутов.
Ну так в итоге Delphi и поступает. Разговор то о том что метаклассы это по сути тотже тип но расширенный и информация также и хранится.
Для примера
Код причем двух функций он даже преобразовывать не стал
Function GetClassStaticName(v:Tobject):String;
begin
result:= TVclass(v.ClassType).StaticVirt
end;
Function GetClassStaticName(v:TVirtClass):String;
begin
result:= v.StaticVirt
end;
Правильно преобразует в одну
public static string GetClassStaticName(object v)
{ string text1;
text1 = (TObjectHelper.ClassType(v) as @MetaTVirtClass).StaticVirt();
return text1;
}
В нативном коде просто был бы вызов по VMT статического виртуального метода, т.к. тип соотвествует декларируемому. Заметь хотя приведение и существует но приведение вынужденное. Но если бы это был не отдельный класс то приведение и не нужно так как виртуальный тип уже известен на этапе компиляции.
20.5.9 Атрибуты
Открытый тип не может использоваться внутри атрибута. Закрытый составной тип может использоваться как аргумент атрибута, но не может быть именем атрибута (attribute-name), потому что System.Attribute не может быть базовым типом для описания шаблонного класса.
class A: Attribute
{
public A(Type t) {...}
}
class B<T>: Attribute {} // Ошибка, не может использовать Attribute как базуclass List<T>
{
[A(typeof(T))] T t; // Ошибка, открытый тип в атрибуте
}
class X
{
[A(typeof(List<int>))] int x; // Ok, закрытый составной тип
[B<int>] int y; // Ошибка, неверное имя атрибута
}
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Serginio1, Вы писали:
AVK>>Т.е. к примеру сравнительно небольшими усилиями можно написать библиотечку, строящую эти самые метаклассы при загрузке сборки на основании рефлекшена и атрибутов.
S> Ну так в итоге Delphi и поступает.
И ради такой фигни корежить язык? Нафик нафик.
S>20.5.9 Атрибуты S>Открытый тип не может использоваться внутри атрибута. Закрытый составной тип может использоваться как аргумент атрибута, но не может быть именем атрибута (attribute-name), потому что System.Attribute не может быть базовым типом для описания шаблонного класса.
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, Serginio1, Вы писали:
AVK>>>Т.е. к примеру сравнительно небольшими усилиями можно написать библиотечку, строящую эти самые метаклассы при загрузке сборки на основании рефлекшена и атрибутов.
S>> Ну так в итоге Delphi и поступает.
AVK>И ради такой фигни корежить язык? Нафик нафик.
Да разговор то не о C# а в общем подходе и красоте решений. S>>20.5.9 Атрибуты S>>Открытый тип не может использоваться внутри атрибута. Закрытый составной тип может использоваться как аргумент атрибута, но не может быть именем атрибута (attribute-name), потому что System.Attribute не может быть базовым типом для описания шаблонного класса.
AVK>Ну блин и перевод. Нифига не понял.
Проще говоря Не может класс дженерик наследоваться от System.Attribute.
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Serginio1, Вы писали:
AVK>>И ради такой фигни корежить язык? Нафик нафик. S> Да разговор то не о C# а в общем подходе и красоте решений.
Слушай, честно говоря при разговоре с тобой я последнее время уже не удивляюсь что с какого то момента ты начинаешь говорить о чем то о своем. Поэтому ты заранее предупреждай что вот тут ты начинаешь говорить о другом, иначе понимать тебя очень сложно.
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, Serginio1, Вы писали:
AVK>>>И ради такой фигни корежить язык? Нафик нафик. S>> Да разговор то не о C# а в общем подходе и красоте решений.
AVK>Слушай, честно говоря при разговоре с тобой я последнее время уже не удивляюсь что с какого то момента ты начинаешь говорить о чем то о своем. Поэтому ты заранее предупреждай что вот тут ты начинаешь говорить о другом, иначе понимать тебя очень сложно.
Согласен и прошу прощения. Просто форум прежде всего по Net. Считаю диалог был очень полезен (лично для меня), хотя и все остались при своем мнении.
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, Serginio1, Вы писали:
VD>У тебя каша в голове. Ты сам мебе постоянно противришь. То ты про метаданные. То ты про данные класса.
Прошу прощения может быть ты абсолютно прав, или я ооочень плохо объясняю.
Метаданные это суть класса такой же как и Type тот же синглтон. Со своими данными и виртуальными методами. Надеюсь ты не будешь отрицать это.
Вот данные Type
private InternalCache m_cachedData;
А данные класса могут быть как статические, но они одинаковы для всех потомков и так и виртуальные одинаковые по структуре но разные по содержимому которые могут хранится в Type (он же и метакласс).
(про атрибуты уже наслышан). И это очень полезно когда работаешь с набором классов наследуемых от единого предка и имеющих виртуальное переопределение на уровне класса за что отвечают метаклассы.
Может я плохо объясняю, но такой подход возможен и он полностью совместим с ООП.
По поводу других решений просто они менее красивы трудоемки и не типизированы.
Еще раз повторюсь если метаданные буду введены в Type или получение ссылки на них будет в VMT
То такие конструкции
Function GetClassStaticName(v:Tobject):String;
begin
result:= TVclass(v.ClassType).StaticVirt
end;
Function GetClassStaticName(v:TVirtClass):String;
begin
result:= v.StaticVirt
end;
генерят один MSIL код
public static string GetClassStaticName(TVirtClass v)
{ string text1;
text1 = (Unit.@GetMetaFromObject(v) as @MetaTVirtClass).StaticVirt();
return text1;
}
Например в Нативном Delphi был бы сразы вызван статический виртуальные метод с отрицательным смещением.
Но если бы в Net ссылка на на метакласс былабы в VMT или метакласс былбы наследником от Type то
Unit.@GetMetaFromObject(v) будет приводить не к ужасающему поиску в хэш таблице по типу, а по смещению в VMT.
А во втором случае просто не будет приведения т.к. класс известен. И за этим следит компилятор в MSIL.
Но метакласс может содержать и данные!!!!
Просто многого хочется. Чисто концептуально.
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, mihailik, Вы писали:
S>> Так как метаклассы уже созданы то мне легче засунуть туда их и создавать оттуда объекты.
M>Ну, это типичные фабрики классов. В Дельфи написать немножко проще, конечно, но не принципиально. По скорости вообще одинаково.
Здравствуйте, Serginio1, Вы писали:
S> Прошу прощения может быть ты абсолютно прав, или я ооочень плохо объясняю. S> Метаданные это суть класса такой же как и Type тот же синглтон. Со своими данными и виртуальными методами. Надеюсь ты не будешь отрицать это.
Буду. Type не синглтон.
S> Вот данные Type S>private InternalCache m_cachedData; S>А данные класса могут быть как статические, но они одинаковы для всех потомков и так и виртуальные одинаковые по структуре но разные по содержимому которые могут хранится в Type (он же и метакласс).
Что есть данные класса? Метаданные?
S> (про атрибуты уже наслышан). И это очень полезно когда работаешь с набором классов наследуемых от единого предка и имеющих виртуальное переопределение на уровне класса за что отвечают метаклассы.
Атрибуты неимеют никакого отношения к наследованию.
S> Может я плохо объясняю, но такой подход возможен и он полностью совместим с ООП.
Да. Постоянно персескакиваешь. Вот и сейчас. Перескачил на атрибуты и, похоже, обратно.
S> Еще раз повторюсь если метаданные буду введены в Type или получение ссылки на них будет в VMT
Type — это хэлпер-класс позволяющий получить метаданные от системы. Метаданные помещаются компилятором в сборки. В последствии система читает их, использует для своих нужд и редоставляет нам через Type.
S> Например в Нативном Delphi был бы сразы вызван статический виртуальные метод с отрицательным смещением.
И? Теперь все должны так делать?
S>Просто многого хочется. Чисто концептуально.
Это то понятно. Вот тлько не понятно чего.
... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, s.ts, Вы писали:
ST>ну... собственно, это нужно знать, как и синтаксис...
Нужно. К сажелению, нужно.
ST>сейчас почему-то считается, что не нужно знать даже синтаксис, который не используешь
Дело в том, что большинство популярных языков программирования имеют более-менее интуитивно понятный синтаксис и семантику. С++ в их числе. Большинству умных людей знакамых с другими языками программирования для того чтобы начать программировать на С++ достаточно изучить базовые принципы. Собствнно чтение Страуструпа и этим и является. Причем при изучении очень тяжело запомнить такие тонкие аспекты. Скорее всго средний человек не обратит на них особого внимания и быстро забудет. Так вот всячиские нелогичности сильно портят картину (да и жизнь в целом), так как нарушают принцип интуитивной понятности. В народе это называется граблями. С++ тем и плох, что для создания на нем качествнных приложений необходимо знать и постоянно помнить о куче граблей, а так же выполнять кучу джентельменских соглашений. В Шарпе как раз попытались избавить людей от макисмального количества граблей и сделать язык максимально интуитивно понятным. К сожалению, не во всем это им удалось на 100%-ов. Избавившись от серьезных граблей с невиртуальностью конструкторов они создали другие (возможность обращения к членам классов до их окончательной инициализации), однако на мой звгляд их выбор верен, так как на практике на подобного рода грабли наступить очень тяжело (уж больно они хорошо видны).
ST>на самом деле все связано: автоинициализация полей/автовызов конструктора предка/"невиртуальность виртуальных функций" это должно быть так, как в C++ или наоборот, третьего не дано
Всегда находится решение которое лучше предыдущих. Проблема только в том, что находится оно не всегда когда нужно, и не теми кому нужно.
ST>если, например, убрать "невиртуальность", то, чтобы граблей (настоящих, а не тех, что по незнанию) избежать, придется автоинициализацию вводить и т.д. — тут одно другое тянет
А неинициализированность переменных в С++ — это уже не грабли. Это стихийное бедствие. Так что это без вопросов нужно было делать.
ST>как раз-таки я цэ нахлебался и теперь очень рад той же дельфе, хотя изначально плевался и конструкторы базового класса забывал вызывать...
Я попрограммировал и на там, и на том достаточно. На дельфи явно меньше, да и не старался залезть в кишки, но все же 3 года отарабанил. С С++ уже около 10 лет вожусь. До этого еще на С пописал не мало (на нем и учился). И скажу честно, при всех недостатках С++ он мне нравится больше. Ведь по количеству граблей дельфи и С++ почти идентичны, а фунционально С++ бокаче (если не считать отсуствия встроенной в язык компонентной поддрежки).
ST>ага (выше я то же самое писал), а можно было не делать автоинициализацию, но убрать автовызов базового конструктора. и потом (как си плюсплюсники) кричать, что это дает могучую эффективность создаваемых приложений при "совсем небольшом ручном кодировании"
Т.е. можно было собрать все грабли дельфи? Можно конечно, но глупо.
Ребята нашли паллиатив.
ST>проблемы-то все равно будут, но они легко обходятся (в дельфе даже есть спецовый флажок в ComponentState под названием csDestroying) всякими там флажками, да декомпозицией
Да нет проблем. Вернее возможно они и есть, но совсем гипотетические. За все время существования Шарпа и дотнета я ни разу не видел, чтобы кто-то наступил на эти грабли. А вот на грибли С++ и дельфи связанные с кострукторами наступают постоянно и основательно.
ST>да нет, дело привычки (см. выше)
Вот чем меньше привычек нужно для создания надежного ПО, тем лучше.
ST>но если приходится часто переключаться между языками, где все по-разному, то да...
В любом случае. Доказано на практике. Сделай поиск по Мастаку и по рсдн и убедись, что эти грабли есть в дельфи и С++ и отсуствуют в Шарпе.
ST>я вот вечно с индексацией массивов путался, а после долгописания на паскале еще и с операторами присваивания/сравнения. хорошо, что шарп это сечет четко. а вот в сях — фигня выходит ... мнда...
Одно дело путаться (на то есть компилятор), а другое дело отложенные, замаскированные ошибки.
ST>p.s. кстати, "самым безответственным и ненадежным компонентом" моей системы оказался борланд со своим кликсом
Ну, всегда можно спихнуть свои проблемы на кого-то. Каликс ведь ты сам выбрал. Кто тебе мешал взять С++ и проверенные библиотеки? Ты же знал, что Каликс совершенно новый продукт.
... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, Lloyd, Вы писали:
L>>Тебе чего-то доказывать? Низачто. Ты же фанатик, тебя аргументы не пронимают.
VD>В отличии от действительно фанатиков и таких как ты я прекрасно воспринимаю обоснованные аргументы.
Во всем этом флейме я вставил только одну реплику -- то что в питоне есть класметоды. На что ты заявил, что питона не знаешь, но, тем не менее, знаешь, что это сплошной тормознутый глюко-баг. Где именно в твоем ответе проявилось мое неприятие аргументов?
Количество твоих сообщений, напротив, в десятки раз превосходит количество моих. Поэтому у меня, в отличие от тебя, у меня большая фактологическая база, на основании которой я смог сделать мнение о тебе, как, еще раз повторюсь, о клоуне и фанатике.
VD>А говоришь эти гадости ты потому что знаешь, что ты не прав.
Могу я поинтересоваться, в чем конкретно я был неправ? Неужели в питоне нет класметодов?
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, Serginio1, Вы писали:
S>> Прошу прощения может быть ты абсолютно прав, или я ооочень плохо объясняю. S>> Метаданные это суть класса такой же как и Type тот же синглтон. Со своими данными и виртуальными методами. Надеюсь ты не будешь отрицать это.
VD>Буду. Type не синглтон.
А что же. То есть GetType одинакового типа не возвращает одну и туже ссылку????
И для кажлого GetType и TypeOf создается свой объект???
S>> Вот данные Type S>>private InternalCache m_cachedData; S>>А данные класса могут быть как статические, но они одинаковы для всех потомков и так и виртуальные одинаковые по структуре но разные по содержимому которые могут хранится в Type (он же и метакласс).
VD>Что есть данные класса? Метаданные?
Например Аттрибут решает задачу хранения данных класса, но доступ к нему не оочень быстр, при кэшировании этих данных мы опять возвращаемся к синглтону ассоциированному с этим типом, но доступ к нему возможен через переменные или Хэштаблицу, что согласись не очень удобно. Но например иерархия классов и структура данных их одинакова. И эту информацию мы можем хранить в метаклассе.А ссылку на них в VMT класса.С каждым классом может ассоциироваться только один метакласс. И здесь мы имеем доступ к данным класса, полиморфизм и быстрый доступ.
S>> (про атрибуты уже наслышан). И это очень полезно когда работаешь с набором классов наследуемых от единого предка и имеющих виртуальное переопределение на уровне класса за что отвечают метаклассы.
VD>Атрибуты неимеют никакого отношения к наследованию.
Не совсем так. Так как я могу для каждого класса иерархии определять один и тотже аттрибут только с разными значениями.
S>> Может я плохо объясняю, но такой подход возможен и он полностью совместим с ООП.
VD>Да. Постоянно персескакиваешь. Вот и сейчас. Перескачил на атрибуты и, похоже, обратно.
Просто аттрибуты являются данными класса, о которых ты спрашивал.
S>> Еще раз повторюсь если метаданные буду введены в Type или получение ссылки на них будет в VMT
VD>Type — это хэлпер-класс позволяющий получить метаданные от системы. Метаданные помещаются компилятором в сборки. В последствии система читает их, использует для своих нужд и редоставляет нам через Type.
Чем при этом отличается метакласс (гипотетически конечно, так как его нет в Net),
только тем что может предоставлять еще и пользовательские данные и методы ???
Пусть живут паралельно с Type, но являются пользовательской сущностью класса. S>> Например в Нативном Delphi был бы сразы вызван статический виртуальные метод с отрицательным смещением.
VD>И? Теперь все должны так делать?
Да нет. Просто дельфевая парадигма безболезненно прожила лет 10 и доказала свою состоятельность. Но никто ни кого не заставляет.
Удобство от применения метаданных для меня лично неоспорима, но интегрированной на уровне Net, а не как сейчас через пользовательские синглтоны привязанные к классам. Кустарщина.
S>>Просто многого хочется. Чисто концептуально.
VD>Это то понятно. Вот тлько не понятно чего.
Метаклассов.
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, s.ts, Вы писали:
ST>как можно попроще реализовать статические виртуальные методы для класса (не городя фабрик и т.п.) на С# ? ST>поделитесь плз. у кого какие идеи по этому поводу ?
ST>вообще как это должно выглядеть по-нормальному ?
всё... фянита-ля-комедия... наконец оно съехало в священные войны!
вот вам и рука бойца...
теперь то хоть знать буду в чём заключается C# vs. other
Здравствуйте, Lloyd, Вы писали:
L>Во всем этом флейме я
Ну, ты не только в это флэйме...
L> вставил только одну реплику -- то что в питоне есть класметоды. На что ты заявил, что питона не знаешь, но, тем не менее, знаешь, что это сплошной тормознутый глюко-баг.
Не ври. О глюках я вообще ничего не говорил. Я только сказал, что он не выдержит конкуренции с полноценными оптимизирующеми компиляторами.
L> Где именно в твоем ответе проявилось мое неприятие аргументов?
В хамстве, я пологаяю...
L>Количество твоих сообщений, напротив, в десятки раз превосходит количество моих. Поэтому у меня, в отличие от тебя, у меня большая фактологическая база, на основании которой я смог сделать мнение о тебе, как, еще раз повторюсь, о клоуне и фанатике.
Чтобы понять твою суть тебе достаточно было просто открыть рот.
VD>>А говоришь эти гадости ты потому что знаешь, что ты не прав.
L>Могу я поинтересоваться, в чем конкретно я был неправ? Неужели в питоне нет класметодов?
Да у тебя еще и со зрением проблемы.
... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Serginio1, Вы писали:
S> А что же. То есть GetType одинакового типа не возвращает одну и туже ссылку????
Не обязаню. Но дело не в этом. Дело в том, что есть море разных экземпляров типа Type.
S> Например Аттрибут решает задачу хранения данных класса,
Это называется метаданными. Т.е. данные описывающие класс, а не принадлежащие ему.
S> но доступ к нему не оочень быстр,
С чего ты это взял? Это коллекция объектов от других ничем не отличается.
S> при кэшировании этих данных мы опять возвращаемся к синглтону ассоциированному с этим типом, но доступ к нему возможен через переменные или Хэштаблицу, что согласись не очень удобно.
Ты сам себе что-то придумываешь и предлагаешь мне с этим соглашаться?
S> Но например иерархия классов и структура данных их одинакова. И эту информацию мы можем хранить в метаклассе.А ссылку на них в VMT класса.С каждым классом может ассоциироваться только один метакласс. И здесь мы имеем доступ к данным класса, полиморфизм и быстрый доступ.
Зачем? Доступ тоже быстрее не станет. Интерпретация она и в фарике интерпретакция.
VD>>Атрибуты неимеют никакого отношения к наследованию. S> Не совсем так. Так как я могу для каждого класса иерархии определять один и тотже аттрибут только с разными значениями.
С тем же успехом ты можешь сделтаь это для любого другого класса.
S> Просто аттрибуты являются данными класса, о которых ты спрашивал.
Я спрашивал?
S> Чем при этом отличается метакласс (гипотетически конечно, так как его нет в Net), S>только тем что может предоставлять еще и пользовательские данные и методы ???
Нет. Атрибуты прекрасно позволяют расширять метаинформацию. Метаклассы дельфи это просто другая реализация. Причем во много более ограниченная и ре предоставляющая всех возможностей что дает ЦЛР.
S> Пусть живут паралельно с Type, но являются пользовательской сущностью класса.
Создай себе класс и делай с ним все что хочешь.
S> Да нет. Просто дельфевая парадигма безболезненно прожила лет 10 и доказала свою состоятельность.
И по прошествии 10 лет мирно скончалась. (это я о переходе на дотнет).
S> Удобство от применения метаданных для меня лично неоспорима, но интегрированной на уровне Net, а не как сейчас через пользовательские синглтоны привязанные к классам. Кустарщина.
Вот сейчас все в порядке. Не говоря уже о выдумку про какие-то синглтоны.
S> Метаклассов.
Т.е. просто чтобы были? На фиг не упали, но приятно... Так что ли?
... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, s.ts, Вы писали:
M>>Ну, это типичные фабрики классов. В Дельфи написать немножко проще, конечно, но не принципиально. По скорости вообще одинаково.
ST>ура! мы прозреваем
Т.е. все же изначально была нужна фабрика классов и я был прав на счет активатора?
... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, Lloyd, Вы писали:
L>>Во всем этом флейме я
VD>Ну, ты не только в это флэйме...
Я польщен. Оказывается, я меня есть поклонники в этом форуме. А кстати в каком еще флейме я тебе успел насолить?
L>> вставил только одну реплику -- то что в питоне есть класметоды. На что ты заявил, что питона не знаешь, но, тем не менее, знаешь, что это сплошной тормознутый глюко-баг.
VD>Не ври. О глюках я вообще ничего не говорил. Я только сказал, что он не выдержит конкуренции с полноценными оптимизирующеми компиляторами.
Да, конечно не выдержит, не вопрос. Так же как и полноценные оптимизирующие компиляторы не выдержат конкуренции со скриптовыми языками в соответствующей нише. Я разве утверждал противоположное? Ты спросил где есть класметоды, кроме делфы, я ответил. А ты сразу в истерику, как будто кто-то трогает C#.
L>> Где именно в твоем ответе проявилось мое неприятие аргументов?
VD>В хамстве, я пологаяю...
Ответ в три слова, из них два -- это класметод и питон. Ты видимо читаешь между строк. Завязывай с этой экстрасенсорикой.
L>>Количество твоих сообщений, напротив, в десятки раз превосходит количество моих. Поэтому у меня, в отличие от тебя, у меня большая фактологическая база, на основании которой я смог сделать мнение о тебе, как, еще раз повторюсь, о клоуне и фанатике.
VD>Чтобы понять твою суть тебе достаточно было просто открыть рот.
Опять не понимаю ничего в твоих формулировках.
Кому понять? Мне? Так мне для этого и рта открывать не надо.
Тебе -- аналогично, ты же у нас, как выяснилось, без пяти минут колдун.
VD>>>А говоришь эти гадости ты потому что знаешь, что ты не прав.
L>>Могу я поинтересоваться, в чем конкретно я был неправ? Неужели в питоне нет класметодов?
VD>Да у тебя еще и со зрением проблемы.
Видимо, да. Если не сложно, объясни пожалуйста, где с моей стороны было хамство.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, s.ts, Вы писали:
VD>Ну, всегда можно спихнуть свои проблемы на кого-то. Каликс ведь ты сам выбрал. Кто тебе мешал взять С++ и проверенные библиотеки? Ты же знал, что Каликс совершенно новый продукт.
у меня ситуация несколько иная:
к сожалению, не я выбирал, а те, кто, в общем-то, и программ не писал и кругозора не имеет (исходя чисто из маркетинговых сображений )
вообще с моим мнением стали считаться, только когда выяснилось, что систему за пару месяцев силами нескольких студентов (которые еще и разбегаются ) не написать
все равно в данный момент на vcl все переводим, но кое-какое наследие всеравно останется (типа каких-то левых скриптовых движков вместо WSH и др.)
со всем остальным, что ты сказал, наконец-то , могу согласиться
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, Serginio1, Вы писали:
S>> А что же. То есть GetType одинакового типа не возвращает одну и туже ссылку????
VD>Не обязаню. Но дело не в этом. Дело в том, что есть море разных экземпляров типа Type.
Читаем Рихтера "При первом обращении к некоторому типу из AppDomain CLR создает экземпляр RuntimeType
и инициализирует его поля данными, отражающими сведениями о типе.
"Поскольку в AppDomain для каждого типа существует только один объект RuntimeType
то можно сравнивать o1.GetType==o2.GetType.
Причем не проверял, но ссылка на него должна прописываться в VMT с отрицательным смещением.
S>> Например Аттрибут решает задачу хранения данных класса,
VD>Это называется метаданными. Т.е. данные описывающие класс, а не принадлежащие ему.
S>> но доступ к нему не оочень быстр,
VD>С чего ты это взял? Это коллекция объектов от других ничем не отличается.
Читаем Рихтера
" Когда компилятор обнаруживает применение специализированного атрибута, он создает экземпляр атрибутного типа, вызывая его конструктор и передавая ему указанные параметры. Затем вомпилятор инициализирует указанные открытые поля и свойства. Затем он его сериализует и сохраняет в метаданных.
GetCustomAttribute Возвращает экземпляр атрибутного типа применяемого к данной сущности. Этот экземпляр создается (десиреализутся) используя поля и свойства, указанные при компиляции.
Если вас волнует быстродействие рассмотрите возможность кэширования результатов".
Что подтверждает и AWK. S>> при кэшировании этих данных мы опять возвращаемся к синглтону ассоциированному с этим типом, но доступ к нему возможен через переменные или Хэштаблицу, что согласись не очень удобно.
VD>Ты сам себе что-то придумываешь и предлагаешь мне с этим соглашаться?
S>> Но например иерархия классов и структура данных их одинакова. И эту информацию мы можем хранить в метаклассе.А ссылку на них в VMT класса.С каждым классом может ассоциироваться только один метакласс. И здесь мы имеем доступ к данным класса, полиморфизм и быстрый доступ.
VD>Зачем? Доступ тоже быстрее не станет. Интерпретация она и в фарике интерпретакция.
Почему это не станет. Причем здесь Интерпретация. Я тебе говорю о хранении данных в метаклассе и вызове его виртуальных методов. VD>>>Атрибуты неимеют никакого отношения к наследованию. S>> Не совсем так. Так как я могу для каждого класса иерархии определять один и тотже аттрибут только с разными значениями.
VD>С тем же успехом ты можешь сделтаь это для любого другого класса.
S>> Просто аттрибуты являются данными класса, о которых ты спрашивал.
VD>Я спрашивал?
" Что есть данные класса? Метаданные? " S>> Чем при этом отличается метакласс (гипотетически конечно, так как его нет в Net), S>>только тем что может предоставлять еще и пользовательские данные и методы ???
VD>Нет. Атрибуты прекрасно позволяют расширять метаинформацию. Метаклассы дельфи это просто другая реализация. Причем во много более ограниченная и ре предоставляющая всех возможностей что дает ЦЛР.
Основанные на рефлексии. Возвращаемся к твоей любимой Интерпретации.
S>> Пусть живут паралельно с Type, но являются пользовательской сущностью класса.
VD>Создай себе класс и делай с ним все что хочешь.
Спасибо, больше мне ничего и не остается. А хотелось бы работать с метаклассами и вызывать его методы и данные как непосредственно из метакласса например при передачи параметом как тип базового класса метакласса. S>> Да нет. Просто дельфевая парадигма безболезненно прожила лет 10 и доказала свою состоятельность.
VD>И по прошествии 10 лет мирно скончалась. (это я о переходе на дотнет).
С теми же метаклассами. И все что ты мне предлаешь там реализовано, но не на том уровне. S>> Удобство от применения метаданных для меня лично неоспорима, но интегрированной на уровне Net, а не как сейчас через пользовательские синглтоны привязанные к классам. Кустарщина.
VD>Вот сейчас все в порядке. Не говоря уже о выдумку про какие-то синглтоны.
S>> Метаклассов.
VD>Т.е. просто чтобы были? На фиг не упали, но приятно... Так что ли?
Объясняю в последний раз.
Берем 1С. Там кстати неплохая работа с метаданными. Правда на нормальном уровне появилась только в 7.7 но помогает очень хорошо.
Вот есть базовый тип причем данные метакласса можно выразить как
TypeID, BaseType, Представление итд (BaseType это число, справочник, документ ...)
Кроме того существуют методы
Дефолтный конструктор, метод визуального редактирования итд.
Например документ содержит коллекцию полей шапки и строчной части. И это все информация метаклассов.
Но доступ к ней я могу получить как из типа, так и из объекта. Это нужно когда имеем объект неопределенного типа вернее базового типа а по нему нужно определить тип, его визуализацию, редактирование итд.
Так же быстрое исследование типа, но типизированное и в том виде в котором мне нужно.
И создание типизированных гридов основанных данных метаклассов итд. Наверное AWK это ближе.
На данном этапе, для каждого класса отдельно создается свой метакласс который отдельно переопределятся как наследник от базового метакласса и так идет паралельно редактирование инициализация итд. Правда в Delphi я могу применять виртуальные статические методы, что облегчает доступ к метаклассом и полиморфизм, но сама реализация как это сделано в Net не очень нравится.
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Serginio1, Вы писали:
S> Причем не проверял, но ссылка на него должна прописываться в VMT с отрицательным смещением.
Тебя прям на отрицательном смещении клинит. Нафига оно там? В отличие от дельфи дотнету никакой бинарной совместимости соблюдать не надо. Ссылка на VMT в указателе есть. Скорее всего там обычная хеш таблица с экземплярами.
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, Serginio1, Вы писали:
S>> Причем не проверял, но ссылка на него должна прописываться в VMT с отрицательным смещением.
AVK>Тебя прям на отрицательном смещении клинит. Нафига оно там? В отличие от дельфи дотнету никакой бинарной совместимости соблюдать не надо. Ссылка на VMT в указателе есть. Скорее всего там обычная хеш таблица с экземплярами.
А проверить????
Во всяком случае у тогоже Рихтера в статье по синхронизации за январь в MSDN, инфомация о типе указана с отрицательным смещением в VMT.
и солнце б утром не вставало, когда бы не было меня
iT>>Оттуда же, откуда ты написал бы атрибут DataTableCountAttribute со значением 10. Конкретный тип знает это про себя.
VD>Тогда уж нет особых проблем создать базовый тип атрибута разместить все что нужно в нем. А потом создать мелкий хэлпер который вынет тебе нужную информацию.
Влад, ты попадаешься на ту же удочку, на которую и Serginio. Маньячишь по какому-то конкретному средству, забывая о цели.
Атрибутами-то можно всё разместить, но со статической виртуальностью было бы объективно удобнее.
AVK>>>Пока что твой код абсолютно бессмысленен с практической точки зрения.
iT>>) Ну это же пример. Ты всегда критикуешь за практическую неприменимость примеры подходов?
AVK>Тебя просили задачу, а ты привел бессмысленный с практической точки зрения код.
Ну, не передёргиваем!
Между прочим, Андрей, саму задачу мы уже видели, и некоторые даже отказались её решать.
iT>Да я согласен, что это не панацея Я просто утверждаю, что в каких-то случаях это реально полезная концепция, стройная и естественным образом вытакающая из возможности хоть как-то работать с типами.
Абсолютно согласен.
iT>Да, атрибутами можно сделать гибче. Но далеко не всегда проще, удобнее, быстрее и надежнее. И что жаль, что такого механизма нет в clr — он бы никому не помешал, а только помог бы.
А здесь однозначно нет.
Дотнет — сбалансированная платформа, на проектирование которой потрачены ох&енные деньги. Если здесь чего-то не прикрутили, значит эта фича вызвала бы проблемы.
Любая виртуальность это оверхед. Мы знаем, какие казуистические навороты происходят вокруг типов в ремотинге, в COM-интеропе, при вызове интерфейсов. Здесь всё посчитано.
VD>Недавно ты мне тут говорил, что я не смогу вынуть число таблиц из типизированного датасета. Я тебе его вынул (бросил все и занялся поной фигней). Теперь ты утверждаешь что мол некрасиво это, кода много.
И правильно. Разве по твоему, это красиво и кода мало? Всё-так нужно не терять рациональной объективности.
VD> Ну, напишу я тебе инкапсуляцию этого даела до одной функции, и что?
Ну да и всё. Эта фишка всёго только и спасает от написания "этого дела до одной функции". Что ты воюешь-то, ведь действительно спасает.
iT>>Ммм.. а AttributeUsage он анализирует на более низком уровне compiler magic, да?
AVK>Ага. В этом правиле есть одно исключение правда, какое не скажу , но оно своими глюками только подтверждает правило.
Здравствуйте, mihailik, Вы писали:
iT>>>Неудобно. И нет жесткого контракта.
VD>>Не знаю. У нас пол Хоума на них сделано.
M>А на Дельфи ничего не сделано? Давайте уж понтами-то не аргументировать.
Где здесь понты? Человек мне про сложность рассказывает, а я как бы видил (да и сам писал) тонну кода простого и читаемого. Проблема высасана из пальца. Если кто-то не умеет инкапсулировать код я тут не причем.
... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, mihailik, Вы писали:
VD>>Что же касается интерпретаторов, то можешь попробовать доказать обратное.
M>Ява, к примеру, виртуально является интерпретатором, хоть на самом деле там и компиляторы внутри трудятся. А с питоном, думаешь, не так?
Чещь не говори. Ява с Хотспотом — это компилятор. В режиме интерпретации она в среднем в 10 раз медленнее самого медленного ВБ6.
... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, mihailik, Вы писали:
M>И правильно. Разве по твоему, это красиво и кода мало? Всё-так нужно не терять рациональной объективности.
VD>> Ну, напишу я тебе инкапсуляцию этого даела до одной функции, и что?
M>Ну да и всё. Эта фишка всёго только и спасает от написания "этого дела до одной функции". Что ты воюешь-то, ведь действительно спасает.
Тебе просто хочется поспорить?
... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, mihailik, Вы писали:
VD>>В Шарпе кострукторы и финалайзеры могут быть виртуальными.
M>Что ты имел ввиду?
M>Конструкторы в C# не могут быть виртуальными. Деструкторы всегда виртуальные. Что значит "могут быть"?
Сдается мне что тебе пора читать матчасть.
... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>>>В Шарпе кострукторы и финалайзеры могут быть виртуальными.
M>>Что ты имел ввиду?
M>>Конструкторы в C# не могут быть виртуальными. Деструкторы всегда виртуальные. Что значит "могут быть"?
VD>Сдается мне что тебе пора читать матчасть.
А можно подробнее? То ты утверждаешь, что static virtual суть зло, то то что конструкторы виртуальные. Как это может существовать совместно?
Здравствуйте, Lloyd, Вы писали:
L>А можно подробнее? То ты утверждаешь, что static virtual суть зло, то то что конструкторы виртуальные. Как это может существовать совместно?
Я не утверждаю что виртуальные конструкторы — это зло. Я утверждаю, что в дотнете они на фиг не упали, и так же не согласен с гипотизой о том, что они являются частью ОО-дизайна.
На счет "конструкторы виртуальные", я не корректно выразился. В конструкторах можно осуществлять виртуальные вызовы (в отличии о С++). Причем это тоже грабли, но не такие глобальные как те что возникают в С++ при обратной ситуации.
... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, mihailik, Вы писали:
S>>когда нужно единообразное создание экземпляров
M>И что, в дотнете нет готового решения?
Только рефлексия либо ручная работа
... << RSDN@Home 1.1.0 stable >>
и солнце б утром не вставало, когда бы не было меня