Feb. 26th, 2008
Тонкое различие в классах Delphi и C#
Feb. 26th, 2008 11:05 amПишу параллельно на обоих языках и постоянно утыкаюсь в ШИЛО в системе типов.
В дельфи имя класса является указателем на его 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");
Статических виртуальных методов - нет. Виртуальных конструкторов нет.
Приходится обходить это все синглетонами. Которые в свою очередь приходится делать для каждого унаследованного класса.
Зато есть рефлекшн, которым это тоже можно обходить, но который все проверки опять же переносит в рунтайм. И есть возможность грузить классы по имени.
В дельфи имя класса является указателем на его 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");
Статических виртуальных методов - нет. Виртуальных конструкторов нет.
Приходится обходить это все синглетонами. Которые в свою очередь приходится делать для каждого унаследованного класса.
Зато есть рефлекшн, которым это тоже можно обходить, но который все проверки опять же переносит в рунтайм. И есть возможность грузить классы по имени.
C# и Haskell
Feb. 26th, 2008 02:53 pmПри написании программы на c#:
а) Дико не хватает ADT и pattern-matching;
б) Попытка писать в обычном стиле приводит к переходу мозга в режим самоддерживающейся генерации кода, имитирующего работу ADT;
в) В интерфейсах, поддерживаемых стандартными классами типа числовых и логических величин, упорно мерещаться классы типов из Haskell
а) Дико не хватает ADT и pattern-matching;
б) Попытка писать в обычном стиле приводит к переходу мозга в режим самоддерживающейся генерации кода, имитирующего работу ADT;
в) В интерфейсах, поддерживаемых стандартными классами типа числовых и логических величин, упорно мерещаться классы типов из Haskell