На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела:
1. Название темы - краткое описание кто/что против кого/чего
2. В первом сообщении - список параметров, по которым идет сравнение.
3. Старайтесь аргументировать свои высказывания. Фразы типа "Венда/Слюникс - ацтой" считаются флудом.
4. Давайте жить дружно и не доводить обсуждение до маразма и личных оскорблений.
Модераторы: Модераторы, Комодераторы
Страницы: (495) « Первая ... 417 418 [419] 420 421 ...  494 495  ( Перейти к последнему сообщению )  
> Delphi vs C++ vs C# , ну и Java немножко, где-то ближе к старшему байту номеров страниц
    Red, в Delphi несколько странное отношение к конструкторам, столько раз уже копья ломали...
      Цитата D_KEY @
      Red, в Delphi несколько странное отношение к конструкторам, столько раз уже копья ломали...


      Сейчас речь о них разве?
        Цитата --Ins-- @
        Но сам факт необходимости переобъявлять конструкторы в потомках - напрягает.

        Странно. Объект конструируется другого класса, а конструктор почему-то должен быть тем же?

        Цитата
        Тро-ло-ло - а в Delphi такой проблемы нет :tong:

        Каких проблем?
          Цитата D_KEY @
          Ты наверно перепутал с описанной им проблемой о том, что параметры по умолчанию для виртуальных функций определяются статически, а сами функции выбираются динамически, что действительно может привести к проблемам. А конструкторы тут ни при чем.

          В Шарпе с появлением dynamic типов параметры теперь тоже могут динамически определятся.
          Что дает, например, интересный способ реализации паттерна Visitor. Да и наверно много чего еще дает, о чем пока могу только догадываться :)

          Была одна задача. Пусть есть иерархия товаров. У каждого товара есть базовое свойство "Операция". Есть так же иерархия операций. Нам нужно для каждой комбинации товара и операции выполнять какие-то специфические действия.
          Сейчас можно наделать n перегрузок вида void Action(<ConcreteGoods> goods, <ConcreteOperation> operation) и вызвать Action((dynamic)goods, (dynamic)operation), где goods и operation ссылки на базовые типы.
            Цитата Red @
            Что делать с "унаследованным"?


            Ну да, примерно такое решение можно было бы использовать:
            ExpandedWrap disabled
              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 @
            Каких проблем?


            Как не переопределять у потомка такой же конструктор, как у предка, и при этом если нужно скрыть унаследованный конструктор - то без проблем скрыть.

            Добавлено
            Цитата Мяут-Настоящий @
            В смысле вот такие?


            Именно!
              Цитата --Ins-- @
              Понятно. Я думаю на самом деле можно было бы что-нибудь придумать разработчикам языка, например слово ключевое слово new тут заюзать или вот именно тут конструктор с одним параметром переопределить как protected или еще что-нибудь. Но сам факт необходимости переобъявлять конструкторы в потомках - напрягает. Тро-ло-ло - а в Delphi такой проблемы нет

              Очень редко натыкаюсь на такую неприятность :) Но тогда просто ставь Resharper, он по alt + Enter моментально тебе его сгенерирует.

              Позиция у разработчиков языка вот какая:

              Цитата
              Для реализации этого нам придется добавлять в язык новый синтаксис. Цена добавления нового синтаксиса очень высока. Для этого требуется проектирование, реализация, тестирование, документирование – а все это требует наших затрат. Но еще большие затраты ложатся на вас, потому что вам нужно выучить, что означает этот синтаксис, в противном случае вы не сможете читать и поддерживать код других разработчиков. Об этих затратах также не нужно забывать. Опять-таки, мы готовы смириться с огромными затратами, только когда чувствуем, что получим явные, убедительные и значительные преимущества для пользователей. В этом случае значительных преимуществ я не вижу.


              Вообще, у них все очень прагматично и почти все завязано на ресурсы (временные, человеческие, денежные). В этом между вами и разница, вы идеалисты - они меркантильные прагматики :)

              Добавлено
              Вот в комитете C++ наверно действительно идеалисты собрались. Но зато пользователи C# гораздо чаще получают новые фичи.
                Цитата Red @
                Позиция у разработчиков языка вот какая:


                Понятно, в принципе вопрос закрыт :) Можно конечно поспорить на тему так ли сложно ввести этот новый синтаксис или нет (я выше привел пример как можно было бы сделать), ну да ладно
                  Цитата --Ins-- @
                  Не тем же, а таким же - унаследованным. Такое иногда нужно. Разве нет?

                  Вот для этого и нужно ключевое слово, а не наоборот. Ибо лучше, когда такое поведение отражено явно.

                  Цитата
                  Как не переопределять у потомка такой же конструктор, как у предка

                  В С++(текущий стандарт):
                  ExpandedWrap disabled
                    class B : public A {
                    public:
                        using A::A;
                    };
                    Цитата --Ins-- @
                    я выше привел пример как можно было бы сделать

                    ну а кто мешает сделать так?
                    ExpandedWrap disabled
                      B(int a) : base(a)
                      {}
                      Цитата D_KEY @
                      Вот для этого и нужно ключевое слово, а не наоборот. Ибо лучше, когда такое поведение отражено явно.


                      Чем лучше? Особенно с учетом того, что выражаясь твоими же терминами, если конструктор без параметров, то я могу сконструировать класс-потомок конструктором предка ;)

                      Цитата kanes @
                      ну а кто мешает сделать так?


                      Понимаешь, мне никто не мешает сделать и так:
                      ExpandedWrap disabled
                        public class A
                        {
                           public virtual void somefunc()
                           {
                              // чего-то делаем
                           }
                        }
                         
                        public class B : A
                        {
                            public override void somefunc()
                            {
                                base.A();
                            }
                        }


                      Но как-то не хотелось бы...
                        Цитата KILLER @
                        что в делфях чтобы возвратить чтото из функции нужно написать Result = значение, а потом Exit;

                        Exit используется для досрочного выхода из функции.
                        Если Result стоит в конце функции, то никакого Exit не нужно.
                        В место Result можно использовать имя функции.
                          Цитата D_KEY @
                          Ибо лучше, когда такое поведение отражено явно.


                          Лучше когда нужно явно определять, что потомок наследует, а не скрывает, интерфейс предка? :blink: Я видимо что-то упустил в этой жизни...
                            Цитата --Ins-- @
                            Понимаешь, мне никто не мешает сделать и так:

                            это порнография :ph34r:
                              Цитата kanes @
                              это порнография


                              Даже спорить не буду, разумеется порнография. Но то что ты мне предложил - такая же порнография ;)
                              Сообщение отредактировано: --Ins-- -
                                Цитата --Ins-- @
                                Но то что ты мне предложил - такая же порнография

                                Почему? Мне вообще не понятно, с какого перепугу конструктор должен наследоваться, ведь по сути наследник - другой тип и конструировать будет по другому, а использование base - это ж вызов конструктора родителя все логично
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (495) « Первая ... 417 418 [419] 420 421 ...  494 495


                                Рейтинг@Mail.ru
                                [ Script execution time: 0.5629 ]   [ 15 queries used ]   [ Generated: 29.07.26, 21:34 GMT ]