Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.192] |
|
|
Правила раздела:
| Страницы: (495) « Первая ... 419 420 [421] 422 423 ... 494 495 ( Перейти к последнему сообщению ) |
Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
|
Сообщ.
#6301
,
|
|
|
|
Везде где требуется перегрузка, но с отложенным до ран-тайм выбором наиболее подходящего кандидата.
Добавлено Нарыл вот. |
|
Сообщ.
#6302
,
|
|
|
|
[quote=--Ins--,1331311075,3093267]Тут у нас недавно была дискуссия на тему диспетчеры и мультиметоды, а вообще да - посетитель самое очевидное. [/quote]
Так сначала и сделал, на комбинации визиторов. Т.е. посетитель операции только решает какой из визиторов продукта вызвать. Но очень запутанно и страшно эта реализация выглядит. Хотя может быть я некошерно реализовал. Лучше пожалуй было бы сделать таблицу да искать в ней соответствие. Но это понял только посмотрев на код через неделю ![]() [/quote][quote=Qraizer,1331311033,3093266]+, Radagast![/quote] я поэтому и написал "вами" с маленькой буквы Добавлено [quote=--Ins--,1331311075,3093267]Ты можешь для класса WMSizeMessage, WMLButtonDownMessage и т.д (потомки Message) написать свой метод-обработчик, а потом вызвать мультиметод, передав ему экземпляр твоего Message, который на основании реального типа вызовет конкретный обработчик. Короче, еще одна возможность замены условной логики полиморфизмом[/quote] Да, прикольно Добавлено Тут надо перестраивать мышление ) |
|
Сообщ.
#6303
,
|
|
|
|
Цитата Red @ Тут надо перестраивать мышление ) Надо было быть дельфистом, изначально было бы перстроено Тро-ло-ло-ло-ло-ло-ло |
|
Сообщ.
#6304
,
|
|
|
|
Нет, конечно. В контексте C++ обычно дискутируют вокруг сравнения тех или иных их реализаций, ибо в языке их нет, а самому написать можно по-всякому. Есть языки, где мультиметоды поддерживаются явно, потуги отдельных товарищей ввести их в язык в новом Стандарте Комитет почему-то отверг.
|
|
Сообщ.
#6305
,
|
|
|
|
Да, чОтко все разложил ) Добавлено Цитата --Ins-- @ Ты можешь для класса WMSizeMessage, WMLButtonDownMessage и т.д (потомки Message) написать свой метод-обработчик, а потом вызвать мультиметод, передав ему экземпляр твоего Message, который на основании реального типа вызовет конкретный обработчик. Короче, еще одна возможность замены условной логики полиморфизмом Еще есть языки (правда не знаю какие, просто где-то видел упоминание, в Немерле точно есть), что можно задать ограничение на входные параметры. Например, если сообщения приходят в виде целочисленных констант (т.е. классов у нас нет), то пишешь несколько методов, в которых указаываешь, что такой-то метод будет вызван при таком значении константы (в общем случае каком-то условии). |
|
Сообщ.
#6306
,
|
|
|
|
Цитата Red @ Еще есть языки (правда не знаю какие, просто где-то видел упоминание, в Немерле точно есть), что можно задать ограничение на входные параметры. Например, если сообщения приходят в виде целочисленных констант (т.е. классов у нас нет), то пишешь несколько методов, в которых указаываешь, что такой-то метод будет вызван при таком значении константы (в общем случае каком-то условии). В c# ты можешь реализовать такое поведение сам, в принципе, используя атрибуты и System.Reflection. И я думаю что такая задача, где так поступить будет оправдано, возникнуть может |
|
Сообщ.
#6307
,
|
|
|
|
Цитата --Ins-- @ В c# ты можешь реализовать такое поведение сам, в принципе, используя атрибуты и System.Reflection. И я думаю что такая задача, где так поступить будет оправдано, возникнуть может Атрибуты можно применять и к параметрам методов, да. Но ведь это не позволит создать перегрузки для разных значений параметров. Или ты имеешь ввиду что-то иное? |
|
Сообщ.
#6308
,
|
|
|
|
Цитата Red @ Атрибуты можно применять и к параметрам методов, да. Но ведь это не позволит создать перегрузки для разных значений параметров. Или ты имеешь ввиду что-то иное? Нет, атрибут именно к методу - например пометить атрибутом что данный метод обрабатывает параметр со значением таким-то. А потом по значению атрибута найти нужны метод. Ну например: ![]() ![]() class Test { [MessageHandler(WM_SIZE)] private void WMSize(Message msg) { .... } [MessageHandler(WM_PAINT)] private void WMPaint(Message msg) { .... } [DefaultMessageHandler()] private void DefaultHandler(Message msg) { // Можно вызвать DefWindowProc, к примеру } public void Dispatch(int msgID, Message msg) { // Ищем по значению msgID нужный обработчик и вызываем // Если метод не найден - вызываем DefaultHandler // Таблицу для поиска метода можно сформировать единожды, например, в классовом конструкторе } } |
|
Сообщ.
#6309
,
|
|
|
|
Цитата Red @ Еще есть языки (правда не знаю какие, просто где-то видел упоминание, в Немерле точно есть), что можно задать ограничение на входные параметры. Например, если сообщения приходят в виде целочисленных констант (т.е. классов у нас нет), то пишешь несколько методов, в которых указаываешь, что такой-то метод будет вызван при таком значении константы (в общем случае каком-то условии). CLOS например: ![]() ![]() (defmethod foo ((x (eql 1))) (format t "One~%")) (defmethod foo ((x (eql (+ 0 2)))) (format t "Two~%")) (defmethod foo ((x number)) (format t "Some number~%")) (dolist (x '(1 2 3)) (foo x)) => ![]() ![]() ~ $ sbcl --script test.lisp One Two Some number ~ $ |
|
Сообщ.
#6310
,
|
|
|
|
А в C++ можно сделать что-то подобное?
![]() ![]() class A { public: static const string name = "A"; }; class B { public: static const string name = "B"; }; class fabric(string name, class... cls) { for(class c : cls) { if(c::name == name) return c; } ??? } fabric("A", A, B); В Delphi, как я понимаю можно Добавлено Да, с CLOS'ом просьба не беспокоить |
|
Сообщ.
#6311
,
|
|
|
|
Мяут-Настоящий, ну, списки типов, variadic template и их совмещение - только это статика, а судя по коду, он навеян динамикой питона
|
|
Сообщ.
#6312
,
|
|
|
|
Цитата Мяут-Настоящий @ А в C++ можно сделать что-то подобное? Сделать что-то подобное всегда можно Только в С++ класс не является объектом времени выполнения. Недостаток это или нет? Думаю, что недостаток, но не критичный для сферы применения языка. Кроме того, это стимулирует работу с типами во время компиляции, а не исполнения, что так же хорошо для ниши языка. Основным негативным последствием данного решения является то, что если тебе нужна развитая и прозрачная объектная система в рантайме, то тебе придется велосипедить. В стандартную библиотеку бы, кстати, могли добавить какую-нибудь библиотечную реализацию объектной модели времени выполнения с нулевой стоимостью неиспользования... |
|
Сообщ.
#6313
,
|
|
|
|
В Дельфи просто конструкторы ущербные. В нормальных языках (Шарп, Джава, плюсы) переменным можно задавать значения в месте декларации, и не нужно пихать все в одну клоаку под названием конструктор. |
|
Сообщ.
#6314
,
|
|
|
|
Цитата D_KEY @ Цитата Мяут-Настоящий @ А в C++ можно сделать что-то подобное? Сделать что-то подобное всегда можно Только в С++ класс не является объектом времени выполнения. Недостаток это или нет? Думаю, что недостаток, но не критичный для сферы применения языка. Кроме того, это стимулирует работу с типами во время компиляции, а не исполнения, что так же хорошо для ниши языка. Основным негативным последствием данного решения является то, что если тебе нужна развитая и прозрачная объектная система в рантайме, то тебе придется велосипедить. В стандартную библиотеку бы, кстати, могли добавить какую-нибудь библиотечную реализацию объектной модели времени выполнения с нулевой стоимостью неиспользования... Не похоже и что он является объектом времени компиляции, либо является слишком простым объектом, без развитых средств работы с ним. |
|
Сообщ.
#6315
,
|
|
|
|
Цитата korvin @ Не похоже и что он является объектом времени компиляции, либо является слишком простым объектом, без развитых средств работы с ним. Отдельных средств, в общем-то, и нет. Так получилось, что таким средством стали шаблоны, которые изначально предназначались просто для обобщенного кода. На практике этого вполне достаточно. Опять же, с учетом ниши. |