metaclass: (Default)
[personal profile] metaclass
Пишу параллельно на обоих языках и постоянно утыкаюсь в ШИЛО в системе типов.
В дельфи имя класса является указателем на его vmt, их можно сравнивать, проверять наследуемость, итд, и самое главное - его можно передавать всюду, где принимается суперкласс и правильность передачи проверяется при компиляции. Я это постоянно использую в таком стиле:

initialization
SomeProcessorFactory.RegisterClass(TDataClass,TDataProcessor);
SomeProcessorFactory.RegisterClass(TDataClass1,TDataProcessor1);
end.

тем самым привязывая к классу модели данных какой-либо специфический класс-обработчик(ORM, UI мапперы, всякую бизнес-логику итд). При необходимости фабрика по типу класса создает обработчик и вызывает его.
Кроме того, в дельфи есть виртуальные конструкторы и виртуальные статические методы.

В C# же на все случаи жизни есть один класс, описывающий классы: Type.
Получить его можно либо от текущего объекта как GetType(), либо по имени класса Type t = typeof(SomeClass);

Статической проверки что я передал правильный Type в функцию - нет. Только рунтаймовая типа такой:
if(!typeof(DataElementKind).IsAssignableFrom(DataElementKindType))
throw new ArgumentException("DataElementKind");

Статических виртуальных методов - нет. Виртуальных конструкторов нет.
Приходится обходить это все синглетонами. Которые в свою очередь приходится делать для каждого унаследованного класса.
Зато есть рефлекшн, которым это тоже можно обходить, но который все проверки опять же переносит в рунтайм. И есть возможность грузить классы по имени.

Date: 2008-02-26 10:06 am (UTC)
From: [identity profile] mr-aleph.livejournal.com
Странно, что C#-пники не доперли увеличить ипобезопасность рефлекшна как это сделано в Java, на основе генериков...

typeof(X) возвращал бы Type<X>, тогда в параметрах ты бы мог явно чекать
void SomeFunc(Type t) where T:SomeBase {}

Интересная идея

Date: 2008-02-26 10:31 am (UTC)
From: [identity profile] mr-st.livejournal.com
Дак дженерики появились гораздо позже чем рефлекшн.

Re: Интересная идея

Date: 2008-02-26 10:40 am (UTC)
From: [identity profile] mr-st.livejournal.com
Насколько я понимаю МС пока забил на "ядро". Счас основная задача налепить побольше всякоразных WPF-ов, Silverlight-ов и т.п.

Date: 2008-02-26 10:34 am (UTC)
From: [identity profile] mr-aleph.livejournal.com
блин случилось обрезание

void SomeFunc<T>(Type<T> t) where T:SomeBase {}

Date: 2008-02-26 10:46 am (UTC)
From: [identity profile] metaclass.livejournal.com
Ага, неплохой вариант.

Date: 2008-02-26 11:05 am (UTC)
From: [identity profile] guamoka.livejournal.com
имхо, совсем не тонкое:) впрочем, как я уже успел убедиться, начиная программировать на языках типа Жабба, лучше забыть все, что знал, скажем на C++.

Date: 2012-04-28 05:50 pm (UTC)
From: [identity profile] dondublon.livejournal.com
спасибо, дельный пост.
попал на него из гугла благодаря вашему нику :)

Profile

metaclass: (Default)
metaclass

April 2017

S M T W T F S
      1
2345678
9101112 131415
16171819202122
23242526272829
30      

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Aug. 14th, 2025 12:16 pm
Powered by Dreamwidth Studios