Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.192] |
|
|
Правила раздела:
| Страницы: (495) « Первая ... 418 419 [420] 421 422 ... 494 495 ( Перейти к последнему сообщению ) |
Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
|
Сообщ.
#6286
,
|
|
|
|
Цитата --Ins-- @ Цитата D_KEY @ Вот для этого и нужно ключевое слово, а не наоборот. Ибо лучше, когда такое поведение отражено явно. Чем лучше? Мой пример с using видел? Что не устраивает? Конструктор не метод объекта, а код, этот объект порождающий. Он обязан инициализировать компоненты объекта, привести его в нужное состояние и обеспечить инварианты. Глупо предполагать, что правильным местом для этого по умолчанию является базовый класс текущего. Потому неявное наследование конструкторов неверное решение в плане дизайна языка. А вот явный запрос на это вполне допустим. В общем, все тот же аргумент по разделению обязанностей и обеспечению инвариантов, который много раз приводился мной, Qraizer'ом и другими участниками дискуссии. |
|
Сообщ.
#6287
,
|
|
|
|
И часто он конструируется по-другому? Не знаю, у меня часто сделано так, что в базовый класс заложено достаточно много общего поведения, так что у меня не так уж и часто |
|
Сообщ.
#6288
,
|
|
|
|
Цитата --Ins-- @ И часто он конструируется по-другому? А в чем смысл наследника, если он также конструируется? |
|
Сообщ.
#6289
,
|
|
|
|
Цитата D_KEY @ Мой пример с using видел? Что не устраивает? Я не понял этот синтаксис и в том, что там происходит, и только поэтому не прокомментировал. Я не говорил что не устраивает Цитата D_KEY @ Конструктор не метод объекта, а код, этот объект порождающий. Он обязан инициализировать компоненты объекта, привести его в нужное состояние и обеспечить инварианты. Глупо предполагать, что правильным местом для этого по умолчанию является базовый класс текущего. Потому неявное наследование конструкторов неверное решение в плане дизайна языка. А вот явный запрос на это вполне допустим. В общем, все тот же аргумент по разделению обязанностей и обеспечению инвариантов, который много раз приводился мной, Qraizer'ом и другими участниками дискуссии. Все замечательно, если бы не 1. юзабилити 2. это правило все равно не работает, т.к. для конструкторы без параметров вполне отлично наследуются, а вот с параметрами - это уже выходит какая-то новая стихия и к ней твои правила применимы, а к new() - почему-то нет Добавлено Цитата kanes @ А в чем смысл наследника, если он также конструируется? Переопределяет виртуальные методы Добавлено Цитата kanes @ А в чем смысл наследника, если он также конструируется? Тем более, что даже если у потомка и появляются новые члены-поля, зачастую достаточно их инициализировать начальными значениями в месте объявления |
|
Сообщ.
#6290
,
|
|
|
|
Цитата --Ins-- @ Цитата D_KEY @ Мой пример с using видел? Что не устраивает? Я не понял этот синтаксис и в том, что там происходит, и только поэтому не прокомментировал. Я не говорил что не устраивает Это явный запрос на использование конструкторов базового класса. Как раз то, что ты хочешь. Цитата 1. юзабилити Что неюзабильного в явном запросе наследования? Цитата 2. это правило все равно не работает, т.к. для конструкторы без параметров вполне отлично наследуются, а вот с параметрами - это уже выходит какая-то новая стихия и к ней твои правила применимы, а к new() - почему-то нет В С++ никакие конструкторы не наследуются. Но могут быть сгенерированы(а не унаследованы) конструктор по умолчанию(без параметров) и конструктор копии. |
|
Сообщ.
#6291
,
|
|
|
|
Цитата да это ж мультиметоды :pray: реально новость для меня оО Сейчас можно наделать n перегрузок вида void Action(<ConcreteGoods> goods, <ConcreteOperation> operation) и вызвать Action((dynamic)goods, (dynamic)operation), где goods и operation ссылки на базовые типы. |
|
Сообщ.
#6292
,
|
|
|
|
Цитата Radagast @ Цитата да это ж мультиметоды :pray: реально новость для меня оОСейчас можно наделать n перегрузок вида void Action(<ConcreteGoods> goods, <ConcreteOperation> operation) и вызвать Action((dynamic)goods, (dynamic)operation), где goods и operation ссылки на базовые типы. Только, насколько я понимаю, не очень эффективные. Но могу ошибаться. |
|
Сообщ.
#6293
,
|
|
|
|
Цитата D_KEY @ Это явный запрос на использование конструкторов базового класса. Как раз то, что ты хочешь. Ну, не совсем то, чего хотелось, но если бы в c# такое было - меня бы в принципе наверное устроило. Цитата D_KEY @ В С++ никакие конструкторы не наследуются. Но могут быть сгенерированы(а не унаследованы) конструктор по умолчанию(без параметров) и конструктор копии. ОК, хорошо, я хочу чтобы конструкторы предков не наследовались, а по умолчанию генерировались их копии, как генерируются для конструктора без параметров. PS: D_KEY, ты в самом деле просто к словам придираешься или хочешь тонко вернуться к теме беседы про конструкторы в Delphi? Мне вот интереснее в данный момент пообсуждать конструкторы c# |
|
Сообщ.
#6294
,
|
|
|
|
А правда, что в Делфи конструкторы виртуальные? (ну или могут таковыми быть)
(я так понимаю, что виртуальные - только конструкторы копирования, но никак не инициализации, да?) |
|
Сообщ.
#6295
,
|
|
|
|
Цитата --Ins-- @ Ну, не совсем то, чего хотелось, но если бы в c# такое было - меня бы в принципе наверное устроило. --Ins--, объясни мне глупому, чем тебе мой-то вариант не понравился, тот же самый явный вызов конструктора базового класса |
|
Сообщ.
#6296
,
|
|
|
|
Цитата Chow @ А правда, что в Делфи конструкторы виртуальные? Могут быть такими. Используются совместно с классовыми ссылками (метаклассами), что позволяет создавать экземпляры классов, неизвестных на этапе компиляции. Добавлено Цитата kanes @ --Ins--, объясни мне глупому, чем тебе мой-то вариант не понравился, тот же самый явный вызов конструктора базового класса Так как ты показал - так и приходится делать. Почему не нравится - ну я же тебе пример привел. Если бы в классе-потомке мне пришлось переопределять методы предка, просто вызывая base, мне бы это тоже не понравилось. Причины - те же |
|
Сообщ.
#6297
,
|
|
|
|
Цитата Red @ Это мультиметоды. Была одна задача. Пусть есть иерархия товаров. У каждого товара есть базовое свойство "Операция". Есть так же иерархия операций. Нам нужно для каждой комбинации товара и операции выполнять какие-то специфические действия. Сейчас можно наделать n перегрузок вида void Action(<ConcreteGoods> goods, <ConcreteOperation> operation) и вызвать Action((dynamic)goods, (dynamic)operation), где goods и operation ссылки на базовые типы. |
|
Сообщ.
#6298
,
|
|
|
|
Qraizer, не знал, а какие еще есть эффектные применения?
Добавлено И еще такой вопрос, есть ли какое-либо известное систематическое изложение упоминаемых вами концепций? Добавлено Или об этом пишут в основном в контексте C++? |
|
Сообщ.
#6299
,
|
|
|
|
+, Radagast!
D_KEY, то - не реализация мультиметодов, вроде бы, даже частная. Задача же - как раз в компетенции двупараметрических мультиметодов. |
|
Сообщ.
#6300
,
|
|
|
|
Цитата Red @ Qraizer, не знал, а какие еще есть эффектные применения? Тут у нас недавно была дискуссия на тему диспетчеры и мультиметоды, а вообще да - посетитель самое очевидное. Ну, можно еще такой вариант: представь себе обработку виндовых сообщений (messages). Ты можешь для класса WMSizeMessage, WMLButtonDownMessage и т.д (потомки Message) написать свой метод-обработчик, а потом вызвать мультиметод, передав ему экземпляр твоего Message, который на основании реального типа вызовет конкретный обработчик. Короче, еще одна возможность замены условной логики полиморфизмом |