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 без этого не обойтись, им совместимость нужна. Соображения производительности неинтересны, поскольку сущностей мало (вряд ли у тебя в программе будет больше сотни классов, обрабатывающихся каким то спец. алгоритмом) и в ходе работы они не меняются (а значит можно эффективно кешировать). Что же касается типобезопасности то тут вы просто никак не хотите оторваться от Дельфевой модели и пытаетесь ее эмулировать. Следует же просто понять что в дотнете дополнительная метаинформация ортогональна основной, а в Дельфи она непосредственно на нее повязана. Лучше или хуже то или другое решение это отдельный вопрос, главное понять что она другая и слепо копировать не стоит.