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

    BMW в любом случае будет вести себя как Car, иначе просто не получится из нее машины... Вот ситуация, стоишь ты на дороге, ровной, без горок, вдали - едет машина, ты видишь как она едет, и т.д., но марки этой машины ты не знаешь, вот когда она к тебе уже подъехала, вот тогда ты только увидел что это BWM, потому что у нее характеристики(по которым ты определил что это именно BMW) - от BMW. Допустим специфический шум двигателя, колеса, кузов, опозновательные значки и т.д.
      Цитата Romkin @
      Цитата D_KEY @
      Да, но конструктор не является методом объекта Максимум - методом класса.

      Интересно, а как это метод класса может иметь доступ к полям экземпляра? В Delphi это запрещено.

      А зачем ему иметь доступ к полям? Если конструктор - метод класса, то он управляет созданием объекта и выполняет инициализацию полей(создание), это не совсем тоже самое, что доступ к полям уже существующего экземпляра. Хотя на мой взгляд методы класса должны иметь право доступа к полям экземпляра(если в их распоряжении каким-то образом оказался этот экземпляр). Не вижу причин для запрета.
      Сообщение отредактировано: D_KEY -
        Цитата D_KEY @
        Он и ведет себя также. "Переключает скорость".

        Вот нифига. Car переключать скорости не может. При такой попытке ты получишь отлуп. Поэтому я и говорю, что BMW отличается от Car, на нем-то ты скорость переключишь! А то, что ты едешь на нем как на обычном "Car" - так так и должно быть.
        Цитата D_KEY @
        Если конструктор - метод класса, то он управляет созданием объекта и выполняет инициализацию полей(создание), это не совсем тоже самое, что доступ к полям уже существующего экземпляра. Хотя на мой взгляд методы класса должны иметь право доступа к полям экземпляра(если в их распоряжении каким-то образом оказался этот экземпляр). Не вижу причин для запрета

        Бррр. А "инициализация" разве не подразумевает "доступ к полям", прямо или опосредованно? Что ты тогда инициализируешь-то?
        Ну и бардак же у вас... В Delphi у метода класса есть доступ только к классу, к его полям и методам.
        Не забывай, что в Delphi есть три вида методов, статический метод класса (это ваш вариант метода класса), метод класса и метод объекта. У метода класса self указывает на метакласс, а у объекта - на экземпляр.
          Цитата Romkin @
          Где написано, что конструктор вызывается автоматически? Даже в С++ ты иногда указываешь, какой конструктор вызвать.

          А где тогда автоматизация? При создании экземпляра класса, я считаю конструктор должен вызываться автоматически, иначе зачем его тогда писать? Я могу и так, повызывать SetValue1, SetValue2, и проинициализировать нужные мне члены класса, на кой мне тогда конструктор вообще нужен?

          Цитата Romkin @
          Даже в С++ ты иногда указываешь, какой конструктор вызвать.

          Это когда я описываю конструктор производного класса, при множественном наследовании, в остальных случаях, не нужно указывать, ибо компилятор и сам знает что его нужно вызвать.
            Цитата Romkin @
            Цитата D_KEY @
            Он и ведет себя также. "Переключает скорость".

            Вот нифига. Car переключать скорости не может.

            Как это? С точки зрения клиента Car именно это и делает. А для чего же еще в контракте описан метод ;) ?

            Цитата
            При такой попытке ты получишь отлуп.

            Нет, не получу. Отлуп я получу, если вдруг попытаюсь создать объект класса Car, т.к. совершенно непонятно(в той модели, которую мы рассматриваем), как можно создать просто "машину".

            Цитата
            Поэтому я и говорю, что BMW отличается от Car, на нем-то ты скорость переключишь!

            Ну как же не могу, если у него есть метод? То, что метод абстрактный - проблема наследников и тех, кто отвечает за создание машин.
            Не клиента.

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

            Бррр. А "инициализация" разве не подразумевает "доступ к полям", прямо или опосредованно? Что ты тогда инициализируешь-то?

            Полей нет до тех пор, пока ты их не проинициализировал. Что тут непонятного? Ты формируешь объект, его нет еще.
            Подумай, скажем о неизменяемых объектах. Задание полей в конструкторе - нормально, а вот изменения их после создания - уже противоречие. Это разные этапы.

            Цитата
            Не забывай, что в Delphi есть три вида методов, статический метод класса (это ваш вариант метода класса), метод класса и метод объекта. У метода класса self указывает на метакласс, а у объекта - на экземпляр.
            Я понимаю. В питоне, например, классы тоже объекты. Речь не о том.
            Строго говоря, у вас нет конструктора - у вас инициализатор уже созданного объекта. Отсюда и непонимание.

            Добавлено
            Опять конструкторы обсуждаем :wall:
            Сообщение отредактировано: D_KEY -
              Цитата Romkin @
              Car переключать скорости не может.
              Почему? В нем реализована некая усредненная или конкретная наиболее распространенная коробка передач. Почему он должен быть обязательно абстрактным?

              Добавлено
              Цитата Romkin @
              Нет этапа конструирования предка, андестенд?
              а inherited Create - это что?
              Сообщение отредактировано: trainer -
                Цитата KILLER @
                Вот именно что не могу, мне ведь выдаст ошибку на стадии компиляции

                ?
                ExpandedWrap disabled
                  A* a;// = new A;
                  a->Foo();
                  a->Bar();


                Цитата KILLER @
                А вот юзнуть в конструкторе член базового класса, который еще не инициализирован вполне реально, и даже более того, это очень сильно реально

                ??
                ExpandedWrap disabled
                  constructor TDerived.Create;
                  begin
                    inherited Create;
                   
                    Foo;
                    Bar;
                  end;


                Цитата D_KEY @
                Везде ссылочная семантика. Проблему производительности работы с примитивными типами решается за счет объявления их иммутабельными и запрета наследования от них. В этом случае оптимизатор сможет заменить ссылки на такие объекты на непосредственные значения, поскольку это не повлияет на видимое поведение.

                И в чём тогда изюминка, если нет разницы?

                Цитата D_KEY @
                Вообще-то это я его тебе советовал. Или korvin. Точно не помню.

                Вот только не надо ляля :whistle:

                Цитата Romkin @
                Еще раз: в Delphi есть метакласс.

                А ещё в Delphi есть виртуальные статические методы :)
                  Цитата DesweR @
                  ?

                  И где там экземпляр класса? :huh:

                  Цитата DesweR @
                  ??

                  В конструкторе производного класса, обратится к полям базового, Create мне нужно ручками писать, оно автоматом ведь не вызовеца.\
                    Цитата KILLER @
                    А где тогда автоматизация? При создании экземпляра класса, я считаю конструктор должен вызываться автоматически, иначе зачем его тогда писать? Я могу и так, повызывать SetValue1, SetValue2, и проинициализировать нужные мне члены класса, на кой мне тогда конструктор вообще нужен?

                    Автоматизация покруче в Delphi будет. Я ж сказал: объект создается сразу, причем кодом, уже написанным опытными людьми, единообразно для любого объекта. На основе данных метакласса, которые собирает автоматически компилятор. Все, что остается программисту - проинициализировать поля. Все. Он не собирается по кусочкам из предков, нафига?

                    Цитата D_KEY @
                    Строго говоря, у вас нет конструктора - у вас инициализатор уже созданного объекта. Отсюда и непонимание.

                    Добавлено Сегодня, 13:28
                    Опять конструкторы обсуждаем

                    Да, если ты помнишь, я согласился с такой формулировкой. Код собственно конструктора в вашем понимании я привел выше, _ClassCreate. Но опять же он вызывается однократно для создания экземпляра, нет цепочки по предкам.

                    Вообще обсуждение конструкторов неконструктивно в дальнейшем: я уже для себя уяснил, что сишники подразумевают под конструктором, и мне это не нравится. Думаю, что объяснить, что такое конструирование в Delphi я тоже смог.

                    Цитата trainer @
                    Цитата (Romkin @ Сегодня, 13:15)
                    Car переключать скорости не может.
                    Почему? В нем реализована некая усредненная или конкретная наиболее распространенная коробка передач. Почему он должен быть обязательно абстрактным?

                    По постановке. У экземпляра Car переключение - абстрактный метод, поэтому переключить скорости у абстрактной машины ты не можешь. BMW - конкретная машина, если ты общаешься с ней как с Car это не должно отменять поведения, модифицированного у BMW.
                    Почему абстрактный: какая коробка у электромобиля? Или ты хочешь вообще отменить абстрактные методы и иметь всегда действие по умолчанию? Если я в метод, который переключает скорости у Сar подал BMW, то я и хочу, чтобы переключилась скорость у BMW, а не какого-то там абстрактного автомобиля. А если я подал в этот метод электромобил - то это явная исключительная ситуация...

                    Добавлено
                    Цитата DesweR @
                    А ещё в Delphi есть виртуальные статические методы

                    Не путай бедных сишников. Виртуальные методы класса и статические методы - это разные вещи. В Delphi есть оба варианта, а в С++ - только второй.
                      Цитата Romkin @
                      Автоматизация покруче в Delphi будет. Я ж сказал: объект создается сразу, причем кодом, уже написанным опытными людьми, единообразно для любого объекта. На основе данных метакласса, которые собирает автоматически компилятор. Все, что остается программисту - проинициализировать поля. Все. Он не собирается по кусочкам из предков, нафига?

                      Конечно автоматизация покруче будет, создать монолит, то оно создает, а вот если во время той же инициализации вылетело исключение, то все - кирдык, уже в монолите оно никак не может откатить совершенные действия - и делаете вы эти действия ручками. В С++, напротив, зачем делать монолитный объект? Проще разбить его на стадии, так удобнее отслеживать где произошла ошибка, и в случае чего автоматически откатить совершенные действия... А автоматизация в Делфи да, аж по круче всех будет... :D
                        Цитата Romkin @
                        Почему абстрактный: какая коробка у электромобиля?
                        Какая есть, такая и стоит. А в чем проблема?
                          Цитата DesweR @
                          Цитата KILLER @
                          Вот именно что не могу, мне ведь выдаст ошибку на стадии компиляции

                          ?
                          ExpandedWrap disabled
                            A* a;// = new A;
                            a->Foo();
                            a->Bar();

                          Тут нет экземпляра.

                          Цитата
                          Цитата KILLER @
                          А вот юзнуть в конструкторе член базового класса, который еще не инициализирован вполне реально, и даже более того, это очень сильно реально

                          ??
                          ExpandedWrap disabled
                            constructor TDerived.Create;
                            begin
                              inherited Create;
                             
                              Foo;
                              Bar;
                            end;

                          А если в конструкторе базового есть вызов полиморфного метода? Не сможет ли он испортить еще несформированный объект?

                          Цитата
                          Цитата D_KEY @
                          Везде ссылочная семантика. Проблему производительности работы с примитивными типами решается за счет объявления их иммутабельными и запрета наследования от них. В этом случае оптимизатор сможет заменить ссылки на такие объекты на непосредственные значения, поскольку это не повлияет на видимое поведение.

                          И в чём тогда изюминка, если нет разницы?
                          Разницы с чем?
                          "Изюминка" в том, что в языке не будет неоднозначности, обобщенный код страдать не будет, и не нужно будет ковыряться в коде и выяснять является ли данный тип классом или нет.

                          Цитата
                          Цитата D_KEY @
                          Вообще-то это я его тебе советовал. Или korvin. Точно не помню.

                          Вот только не надо ляля :whistle:
                          Ну как знаешь, только я TAPL до участия в теме читал. Думаю, что korvin тоже.
                          Быть может и ты его читал и мы советовали это делать друг другу.

                          Цитата
                          Цитата Romkin @
                          Еще раз: в Delphi есть метакласс.

                          А ещё в Delphi есть виртуальные статические методы :)

                          Нечто не может являтся "виртуальным" и "статическим" одновременно. Ты имел в виду методы класса? Это да, хорошо :)
                            Цитата Romkin @
                            Но опять же он вызывается однократно для создания экземпляра, нет цепочки по предкам.


                            Что-то я недогоняю. Вот есть у нас всё то же отношение TAbstractButton <- TCustomButton <- TButton. Предположим, что у TAbstractButton есть поле State, которое при инициализации должно быть установлено в значение Normal (которое имеет числовое значение '10'). Правильно ли я понимаю (из твоего утверждения), что это поле должно устанавливаться соответствующим образом и в "конструкторе" класса TCustomButton и в конструкторе класса TButton?
                              Цитата Romkin @
                              По постановке. У экземпляра Car переключение - абстрактный метод, поэтому переключить скорости у абстрактной машины ты не можешь. BMW - конкретная машина, если ты общаешься с ней как с Car это не должно отменять поведения, модифицированного у BMW.
                              Почему абстрактный: какая коробка у электромобиля? Или ты хочешь вообще отменить абстрактные методы и иметь всегда действие по умолчанию? Если я в метод, который переключает скорости у Сar подал BMW, то я и хочу, чтобы переключилась скорость у BMW, а не какого-то там абстрактного автомобиля. А если я подал в этот метод электромобил - то это явная исключительная ситуация...

                              В постановке задачи, коробка передач не фигурировала, это ты ее придумал переключать у Бэхи..
                              А управляешь ты этой BMW через класс Car, иначе на кой нам вообще этот Car нужен ? Электромобиль - это как раз таки тот класс, который будет наследоватся от Car, и изменять поведение переключения передач, если у машины это будет просто дернуть рычаг и повысить скорость, то у электромобиля - это будет например что то другое...
                                Цитата trainer @
                                Какая есть, такая и стоит.


                                ExpandedWrap disabled
                                  class GearBox
                                  {
                                  public:
                                     virtual void SwitchGear() = 0;
                                  };
                                   
                                  class ManualGearBox
                                  {
                                  public:
                                      virtual void SwitchGerar();
                                  };
                                   
                                  class AutomaticGearBox
                                  {
                                  public:
                                      virtual void SwitchGerar();
                                  };
                                   
                                  class Car
                                  {
                                  public:
                                     Car(GearBox*  box = NULL) : m_GearBox(box ? box : new ManualGearBox()) {;}
                                   
                                     void SwitchGear() {m_GearBox->SwitchGear();}
                                  private:
                                     GearBox* m_GearBox;
                                  };
                                   
                                  class BMWCar : public Car
                                  {
                                  public:
                                     BMWCar() : Car(new AutomaticGearBox()) {;}
                                  };


                                Нда... Как-то вот так. :) Какая есть - такая и стоит. :)
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (495) « Первая ... 206 207 [208] 209 210 ...  494 495


                                Рейтинг@Mail.ru
                                [ Script execution time: 0.3363 ]   [ 15 queries used ]   [ Generated: 1.08.26, 09:37 GMT ]