Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.192] |
|
|
Правила раздела:
| Страницы: (495) « Первая ... 417 418 [419] 420 421 ... 494 495 ( Перейти к последнему сообщению ) |
Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
|
Сообщ.
#6271
,
|
|
|
|
Red, в Delphi несколько странное отношение к конструкторам, столько раз уже копья ломали...
|
|
Сообщ.
#6272
,
|
|
|
|
Цитата D_KEY @ Red, в Delphi несколько странное отношение к конструкторам, столько раз уже копья ломали... Сейчас речь о них разве? |
|
Сообщ.
#6273
,
|
|
|
|
Странно. Объект конструируется другого класса, а конструктор почему-то должен быть тем же? Цитата Тро-ло-ло - а в Delphi такой проблемы нет ![]() Каких проблем? |
|
Сообщ.
#6274
,
|
|
|
|
Цитата D_KEY @ Ты наверно перепутал с описанной им проблемой о том, что параметры по умолчанию для виртуальных функций определяются статически, а сами функции выбираются динамически, что действительно может привести к проблемам. А конструкторы тут ни при чем. В Шарпе с появлением dynamic типов параметры теперь тоже могут динамически определятся. Что дает, например, интересный способ реализации паттерна Visitor. Да и наверно много чего еще дает, о чем пока могу только догадываться Была одна задача. Пусть есть иерархия товаров. У каждого товара есть базовое свойство "Операция". Есть так же иерархия операций. Нам нужно для каждой комбинации товара и операции выполнять какие-то специфические действия. Сейчас можно наделать n перегрузок вида void Action(<ConcreteGoods> goods, <ConcreteOperation> operation) и вызвать Action((dynamic)goods, (dynamic)operation), где goods и operation ссылки на базовые типы. |
|
Сообщ.
#6275
,
|
|
|
|
Ну да, примерно такое решение можно было бы использовать: ![]() ![]() public class A { public A(int a) { _a = a; } } public class B : A { new protected B(int a) : base(a); { } public B(int a, int b) : this(a) { _b = b; } } Скрывать конструкторы предков нужно как правило гораздо реже, чем повторять конструкторы предков, ИМХО ручное переопределение если и нужно, то для скрытия, а не для повторения Добавлено Цитата D_KEY @ Объект конструируется другого класса, а конструктор почему-то должен быть тем же? Не тем же, а таким же - унаследованным. Такое иногда нужно. Разве нет? Добавлено Цитата D_KEY @ Каких проблем? Как не переопределять у потомка такой же конструктор, как у предка, и при этом если нужно скрыть унаследованный конструктор - то без проблем скрыть. Добавлено Именно! |
|
Сообщ.
#6276
,
|
|
|
|
Цитата --Ins-- @ Понятно. Я думаю на самом деле можно было бы что-нибудь придумать разработчикам языка, например слово ключевое слово new тут заюзать или вот именно тут конструктор с одним параметром переопределить как protected или еще что-нибудь. Но сам факт необходимости переобъявлять конструкторы в потомках - напрягает. Тро-ло-ло - а в Delphi такой проблемы нет Очень редко натыкаюсь на такую неприятность Но тогда просто ставь Resharper, он по alt + Enter моментально тебе его сгенерирует. Позиция у разработчиков языка вот какая: Цитата Для реализации этого нам придется добавлять в язык новый синтаксис. Цена добавления нового синтаксиса очень высока. Для этого требуется проектирование, реализация, тестирование, документирование – а все это требует наших затрат. Но еще большие затраты ложатся на вас, потому что вам нужно выучить, что означает этот синтаксис, в противном случае вы не сможете читать и поддерживать код других разработчиков. Об этих затратах также не нужно забывать. Опять-таки, мы готовы смириться с огромными затратами, только когда чувствуем, что получим явные, убедительные и значительные преимущества для пользователей. В этом случае значительных преимуществ я не вижу. Вообще, у них все очень прагматично и почти все завязано на ресурсы (временные, человеческие, денежные). В этом между вами и разница, вы идеалисты - они меркантильные прагматики Добавлено Вот в комитете C++ наверно действительно идеалисты собрались. Но зато пользователи C# гораздо чаще получают новые фичи. |
|
Сообщ.
#6277
,
|
|
|
|
Цитата Red @ Позиция у разработчиков языка вот какая: Понятно, в принципе вопрос закрыт Можно конечно поспорить на тему так ли сложно ввести этот новый синтаксис или нет (я выше привел пример как можно было бы сделать), ну да ладно |
|
Сообщ.
#6278
,
|
|
|
|
Цитата --Ins-- @ Не тем же, а таким же - унаследованным. Такое иногда нужно. Разве нет? Вот для этого и нужно ключевое слово, а не наоборот. Ибо лучше, когда такое поведение отражено явно. Цитата Как не переопределять у потомка такой же конструктор, как у предка В С++(текущий стандарт): ![]() ![]() class B : public A { public: using A::A; }; |
|
Сообщ.
#6279
,
|
|
|
|
Цитата --Ins-- @ я выше привел пример как можно было бы сделать ну а кто мешает сделать так? ![]() ![]() B(int a) : base(a) {} |
|
Сообщ.
#6280
,
|
|
|
|
Цитата D_KEY @ Вот для этого и нужно ключевое слово, а не наоборот. Ибо лучше, когда такое поведение отражено явно. Чем лучше? Особенно с учетом того, что выражаясь твоими же терминами, если конструктор без параметров, то я могу сконструировать класс-потомок конструктором предка Цитата kanes @ ну а кто мешает сделать так? Понимаешь, мне никто не мешает сделать и так: ![]() ![]() public class A { public virtual void somefunc() { // чего-то делаем } } public class B : A { public override void somefunc() { base.A(); } } Но как-то не хотелось бы... |
|
Сообщ.
#6281
,
|
|
|
|
Цитата KILLER @ что в делфях чтобы возвратить чтото из функции нужно написать Result = значение, а потом Exit; Exit используется для досрочного выхода из функции. Если Result стоит в конце функции, то никакого Exit не нужно. В место Result можно использовать имя функции. |
|
Сообщ.
#6282
,
|
|
|
|
Цитата D_KEY @ Ибо лучше, когда такое поведение отражено явно. Лучше когда нужно явно определять, что потомок наследует, а не скрывает, интерфейс предка? Я видимо что-то упустил в этой жизни... |
|
Сообщ.
#6283
,
|
|
|
|
Цитата --Ins-- @ Понимаешь, мне никто не мешает сделать и так: это порнография |
|
Сообщ.
#6284
,
|
|
|
|
Цитата kanes @ это порнография Даже спорить не буду, разумеется порнография. Но то что ты мне предложил - такая же порнография |
|
Сообщ.
#6285
,
|
|
|
|
Цитата --Ins-- @ Но то что ты мне предложил - такая же порнография Почему? Мне вообще не понятно, с какого перепугу конструктор должен наследоваться, ведь по сути наследник - другой тип и конструировать будет по другому, а использование base - это ж вызов конструктора родителя все логично |