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

    если мы возвращаем объект, интерфейс которого предполагает изменение его полей, то почему на это должен влиять объект-контейнер? поведение возвращаемого объекта не должно зависеть от контейнера. как спроектировали контейнер, так он и работает
    Сообщение отредактировано: korvin -
      Цитата --Ins-- @
      Что ты подразумеваешь под уличной магией?
      Как то так:
      ExpandedWrap disabled
        type
          TPoint = class
            public:
            X, Y: Integer;
          end;
         
        TRect = class
        private
          _point: TPoint;
          function GetPoint(): TPoint;
          procedure SetPoint(Value: TPoint);
        public
          property Point: TPoint read GetPoint write SetPoint;
        end;
         
        function TRect.GetPoint(Integer): TPoint;
        begin
          Result := _point;
        end;
         
        procedure TRect.SetPoint(Value: TPoint);
        begin
         _point := Value;
        end;
         
        ...
         
        my_point: TRect;
        my_point.Point.x := 10;
         
        Writeln(my_point.Point.x);
      Собственно, что выведется на консоль?
        Цитата MyNameIsIgor @
        point.X := 10;


        Что такое Point.X? Это временный объект? Так этот код не изменит состояние TRect, в отличие от...
        Цитата MyNameIsIgor @
        rect.Points[0].X := 10;

        ... который по идее должен изменить.
          Цитата --Ins-- @
          Цитата D_KEY @
          Если да, то о какой инкапсуляции может идти речь?


          А че не так-то? :blink:

          В обход сеттера поменяли состояние внутреннего поля.
          Объясняю на С++, без всякого сахара для свойств.
          ExpandedWrap disabled
            class MyClass
            {
            public:
                const string &GetName() const;
                void SetName(const string &name);
            };


          Я получаю имя по ссылке, но не могу поменять его. У вас же будет можно, например, добавить символ к имени, если string - класс.
          string тут для примера, важен сам факт.
            Цитата Повстанець @
            Собственно, что выведется на консоль?


            10
              Цитата --Ins-- @
              Что такое Point.X? Это временный объект?

              Нет, это переменная с именем point типа Point.
                Цитата korvin @
                Цитата D_KEY @
                То, что мы получим ссылку на объект(ведь так?), а не копию. Кстати, сможем ли мы поменять состояние это объекта через вызов метода?
                Если да, то о какой инкапсуляции может идти речь?

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

                Какой контейнер :wacko: ? Речь идет об атрибутах объекта, определяющих его состояние.
                  Цитата D_KEY @
                  Объясняю на С++, без всякого сахара для свойств.
                  ExpandedWrap disabled
                    class MyClass
                    {
                    public:
                        const string &GetName() const;
                        void SetName(const string &name);
                    };


                  Я получаю имя по ссылке, но не могу поменять его. У вас же будет можно, например, добавить символ к имени, если string - класс.
                  string тут для примера, важен сам факт.

                  потому что ты возвращаешь значение не типа string, а типа const string =)
                    Цитата korvin @
                    потому что ты возвращаешь значение не типа string, а типа const string =)

                    Дык в дельфи, если это класс, то ссылка на экземпляр и отдаётся. Только в дельфи нет const, потому жопа...
                    Сообщение отредактировано: MyNameIsIgor -
                      Цитата D_KEY @
                      В обход сеттера поменяли состояние внутреннего поля.


                      Еще раз, ты разницу между:
                      Цитата --Ins-- @
                      Form.ActiveControl := Panel;
                      и
                      Form.ActiveControl.Visible := False;

                      понимаешь? Как сеттер ActiveControl во втором случае-то должен участвовать? Ссылочные типы и размерные типы здесь себя ведут по-разному. Сеттер ссылочного типа принимает параметром ссылку, а сеттер типа-значения - значение.
                        Цитата D_KEY @
                        Какой контейнер :wacko: ? Речь идет об атрибутах объекта, определяющих его состояние.

                        как это какой? в твоем же примере MyClass -- контейнер, string name -- объект типа с изменяемым интерфейсом, но ты геттером возвращаешь объект типа const string, поэтому изменить name извне не получается
                          Цитата --Ins-- @
                          Цитата Повстанець @
                          Собственно, что выведется на консоль?


                          10

                          А как же инкапсуляция? Вот так взяли и поменяли свойство, не спросив у объекта. Я хотя бы могу как-то вернуть копию объекта(так, чтобы клиенту не пришлось ее явно удалять)? Или это невозможно в принципе?

                          Добавлено
                          Цитата korvin @
                          Цитата D_KEY @
                          Объясняю на С++, без всякого сахара для свойств.
                          ExpandedWrap disabled
                            class MyClass
                            {
                            public:
                                const string &GetName() const;
                                void SetName(const string &name);
                            };


                          Я получаю имя по ссылке, но не могу поменять его. У вас же будет можно, например, добавить символ к имени, если string - класс.
                          string тут для примера, важен сам факт.

                          потому что ты возвращаешь значение не типа string, а типа const string =)

                          Нет, я возвращаю значение типа const string &
                            Цитата --Ins-- @
                            понимаешь? Как сеттер ActiveControl во втором случае-то должен участвовать? Ссылочные типы и размерные типы здесь себя ведут по-разному. Сеттер ссылочного типа принимает параметром ссылку, а сеттер типа-значения - значение.

                            Только вот Form нифига не в курсе, что её ActiveControl изменился. В результате накручивают ещё усложнение - свойства с уведомлениями, мы на них подписываемся, получаем сообщения хз откуда, короче, имеет только страшную головную боль вместо того, чтобы цивильно юзать методы, которые говорят "я посылаю тебе сообщение".
                              Цитата D_KEY @
                              А как же инкапсуляция? Вот так взяли и поменяли свойство, не спросив у объекта.


                              Еще как спросив :) Только того объекта, чье свойство устанавливается, а это - объект Point, а не Rect :)
                                Цитата --Ins-- @
                                Цитата D_KEY @
                                В обход сеттера поменяли состояние внутреннего поля.


                                Еще раз, ты разницу между:
                                Цитата --Ins-- @
                                Form.ActiveControl := Panel;
                                и
                                Form.ActiveControl.Visible := False;

                                понимаешь? Как сеттер ActiveControl во втором случае-то должен участвовать?

                                --Ins--, я прекрасно понимаю что происходит. Я не понимаю, зачем это происходит именно так.

                                Цитата
                                Ссылочные типы и размерные типы здесь себя ведут по-разному. Сеттер ссылочного типа принимает параметром ссылку, а сеттер типа-значения - значение.

                                Да, и это мне не нравится :'(
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (495) « Первая ... 37 38 [39] 40 41 ...  494 495


                                Рейтинг@Mail.ru
                                [ Script execution time: 0.1374 ]   [ 14 queries used ]   [ Generated: 29.07.26, 04:43 GMT ]