На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела:
1. Название темы - краткое описание кто/что против кого/чего
2. В первом сообщении - список параметров, по которым идет сравнение.
3. Старайтесь аргументировать свои высказывания. Фразы типа "Венда/Слюникс - ацтой" считаются флудом.
4. Давайте жить дружно и не доводить обсуждение до маразма и личных оскорблений.
Модераторы: Модераторы, Комодераторы
Страницы: (245) « Первая ... 224 225 [226] 227 228 ...  244 245  ( Перейти к последнему сообщению )  
> Есть ли будущее у DELPHI?
    Цитата --Ins-- @
    Хотя... Если это поле - это не число. Если это List, который потомок должен не только создать, но и положить туда пару элементов. Как это сделать, не делая поле publiс/protected или не геттеров к нему только лишь специально ради этого?


    Код на Java

    ExpandedWrap disabled
      class Base [
        private final List field;
       
        protected Base(List field) {
          this.field = field;
        }
      }
       
      class Derrived extends Base {
        public Derrived() {
          super(new ArrayList());
           // Как мне тут положить в List элементы?
        }
      }


    Добавлено
    Цитата Flex Ferrum @
    Смотри мой пример.


    Флекс, я с++ не могу читать, мне он не понятен, объясни на пальцах

    Добавлено
    Цитата D_KEY @
    Более того, его может быть придется не только создать, но и проинициализировать тоже по-разному


    Ну да, смотри код. Инициализирует ПОЛЕ - предок. Потомку лишь делегируется показать чем
    ExpandedWrap disabled
      Base = class
      private
        field: TList;
      protected
        function CreateMyField: TList; virtual abstract;
      public
        constructor Create;
      end;
       
      constructor Base.Create;
      begin
        field := CreateMyField;
      end;
       
      // В потомке
      function Derrived.CreateMyField: TList;
      begin
        Result := TList.Create;
        List.Add(bar);
        List.Add(foo);
      end;
      Цитата --Ins-- @
      Флекс, я с++ не могу читать, мне он не понятен, объясни на пальцах

      Ну, по большому счёту - там вариация на тему виртуального конструктора. В базовом классе делается шаблонный фабричный метод, который:
      1. Создаёт экземпляр нужного производного класса;
      2. Вызывает метод пост-инициализации, внутри которого и вызываются все необходимые виртуальные методы.
      Пользователь, в итоге, дёргает этот метод и ему возвращается созданный экземпляр класса, должным образом проинициализированный. В производном классе нужно просто перегрузить соответствующие виртуальные методы.
        --Ins--, да там фактически статический шаблонный метод в базовом классе, который создает объект указанного класса-наследника и дергает виртуальный метод. Т.е. об этом ты тоже говорил, да.
        Сообщение отредактировано: D_KEY -
          Цитата Flex Ferrum @
          Смотри мой пример

          IMHO, переусложнён и совершенно напрасно вводится двухэтапное конструирование. И в примере korvin'а это всё разруливается.
            Цитата MyNameIsIgor @
            IMHO, переусложнён и совершенно напрасно вводится двухэтапное конструирование.

            В общем случае без двухэтапного конструирования тут не обойтись. :-?
              Цитата --Ins-- @
              Хотя... Если это поле - это не число. Если это List, который потомок должен не только создать, но и положить туда пару элементов.

              А в чем принципиальное отличие от числа? Можно просто проинициализировать список элементами, а в случаях, когда нельзя - можно написать внешнюю функцию/статический метод такой инициализации, результат которой передать в конструктор базового класса.
                Цитата Flex Ferrum @
                В общем случае без двухэтапного конструирования тут не обойтись

                Мой опыт подсказывает, что в общем случае оно и не нужно. А возникает "необходимость" из-за таких вот чисто синтетических задач "нет-нет-нет, никаких protected setter'ов!". Это было во-первых.
                А во-вторых, как я уже и сказал, даже наш случай решает пример korvin'а со статическим методом.
                  Цитата D_KEY @
                  А в чем принципиальное отличие от числа? Можно просто проинициализировать список элементами, а в случаях, когда нельзя - можно написать внешнюю функцию/статический метод такой инициализации, результат которой передать в конструктор базового класса.

                  Ins тут прав в том, что таких полей может быть несколько, и они могут предполагать сложную инициализацию. В итоге конструктор базы может быть либо чрезмерно усложнённым, либо будут слишком сильные ограничения на клиентов. Для избежания этих проблем и вводятся "виртуальные" конструкторы. Которые, как можно видеть, довольно легко реализуются на плюсах.

                  Добавлено
                  MyNameIsIgor, случаи, как известно, бывают разные. Не всегда инициализацию можно красиво сделать одноэтапной.
                    Цитата Flex Ferrum @
                    Ins тут прав в том, что таких полей может быть несколько, и они могут предполагать сложную инициализацию. В итоге конструктор базы может быть либо чрезмерно усложнённым, либо будут слишком сильные ограничения на клиентов. Для избежания этих проблем и вводятся "виртуальные" конструкторы. Которые, как можно видеть, довольно легко реализуются на плюсах.

                    Ну в данном случае можно быть проще.
                      Цитата Flex Ferrum @
                      вводятся "виртуальные" конструкторы.


                      Это не виртуальные конструкторы, это полиморфные конструкторы. :D Виртуальные конструкторы - это отдельная фича Delphi и их назначение другое. Виртуальные конструкторы используются совместно с классовыми ссылками, когда можно создавать с помощью конструктора объект неизвестного на этапе компиляции класса (еще одна встроенная в язык фабрика)
                        Цитата D_KEY @
                        Ну в данном случае можно быть проще.

                        В данном конкретном - да.

                        Добавлено
                        Цитата --Ins-- @
                        Это не виртуальные конструкторы, это полиморфные конструкторы.

                        Пусть будут полиморфные. Мне как-то по-барабану. :D
                          Цитата Flex Ferrum @
                          Не всегда инициализацию можно красиво сделать одноэтапной

                          В реальных фрэймворках и библиотеках никогда не встречал проблем. Как и двухэтапного конструирования.
                            Цитата --Ins-- @
                            Хотя... Если это поле - это не число. Если это List, который потомок должен не только создать, но и положить туда пару элементов. Как это сделать, не делая поле publiс/protected или не геттеров к нему только лишь специально ради этого?

                            А что поменяется?
                            Цитата --Ins-- @
                            Нет, он просто его создает и возвращает предку

                            Ну так в том случае так же будет, только запись другая. Да и вообще, ситуация, когда базовому классу необходимо знание дочернего, явно намекает на то, что наследование применено не очень-то к месту :-?
                              Цитата MyNameIsIgor @
                              В реальных фрэймворках и библиотеках никогда не встречал проблем. Как и двухэтапного конструирования.

                              Нередко это аккуратненько так прячется за pimpl'ом и наружу не торчит. :)
                                Цитата MyNameIsIgor @
                                "нет-нет-нет, никаких protected setter'ов!". Это было во-первых.


                                Потому что это костыль - протектед сеттер только для того, чтобы иметь доступ в конструкторе :D
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (245) « Первая ... 224 225 [226] 227 228 ...  244 245


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,2179 ]   [ 15 queries used ]   [ Generated: 20.07.25, 09:47 GMT ]