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


    Так, еще раз. Когда ты пишешь get, то в интерфейсе класса автоматически появляется метод get_MyProp, из которого ты дернешь еще один метод. У тебя - два метода! Хотя реально нужен только один.

    Цитата MyNameIsIgor @
    Проблем не вижу.


    Сравним на примере? Я даю условие, а отом ты приводишь решение на C#, я - на Delphi и мы сравним ;)

    Цитата MyNameIsIgor @
    ему религия не позволяет?

    Инкапсуляция ему не позволяет. Он не задается вопросом, Points - это что, поле-массив или свойство с геттером/сеттером? И он в любом случае напишет Points[0] := 10;, что бы там ни было, а не SetPoint(0, 10). Иначе свойства вообще как таковые не нужны, если явно вызывать методы.

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


    В принципе такую позицию можно принять с некоторым допущение, но тогда бы в C# бы ее и приняли - зачем делать кастрированные свойства? Не делали бы вообще, пострадала бы инкапсуляция правда в этом случае. Свойства - это хорошая штука, инкапсуляция в полном ее проявлении, ты работаешь с сущностью как с полем (такое представление о члене класса во многих случаях гораздо удобнее), притом что
    1. Реальное поле тебе не доступно и доступ к нему строго контролируем.
    2. Реального поля может и не быть вовсе
    3. При чтении/записи можно выполнять дополнительные действия (инициировать события, рассчитывать значение только при запросе и т.д.)
    4. Он не знает что там на самом деле - поле или метод, притом что код его одинаков. И если внутреннее представление поменяется - на клиентском коде это не отобразится

    Добавлено
    Цитата MyNameIsIgor @
    Тупо синтаксический сахар


    Да ты сахара этого даже и не пробовал никогда, как ты можешь судить? :D В С++ ООП на зародышевом уровне, печально что C#, который позиционируется как 100%-объектный, в некоторых вопросах недалеко ушел. Кури инкапсуляцию
      Цитата --Ins-- @
      Так, еще раз. Когда ты пишешь get, то в интерфейсе класса автоматически появляется метод get_MyProp, из которого ты дернешь еще один метод. У тебя - два метода! Хотя реально нужен только один.

      В IL коде что ли? Вах, беда то какая! Чему это мешает то? На использовании класса это никак не скажется. При том, что реальные геттер/сеттеры будут private или protected, и потому не будут видны.
      Цитата --Ins-- @
      Сравним на примере? Я даю условие

      Для начала такой вопрос: можно ли в дельфи сделать геттер public, а сеттер - protected?
      Цитата --Ins-- @
      а отом ты приводишь решение на C#, я - на Delphi и мы сравним

      Кто "мы"? Как будет происходить сравнение? По каким параметрам?
      Цитата --Ins-- @
      Инкапсуляция ему не позволяет. Он не задается вопросом, Points - это что, поле-массив или свойство с геттером/сеттером? И он в любом случае напишет Points[0] := 10;, что бы там ни было, а не SetPoint(0, 10). Иначе свойства вообще как таковые не нужны, если явно вызывать методы.

      Глухой write only? В третий раз
      Цитата MyNameIsIgor @
      И я ещё раз спрашиваю: как синтаксически вызываются индексаторы, у которых разные имена, но одинаковые параметры?


      Добавлено
      Цитата --Ins-- @
      Да ты сахара этого даже и не пробовал никогда, как ты можешь судить? В С++ ООП на зародышевом уровне, печально что C#, который позиционируется как 100%-объектный, в некоторых вопросах недалеко ушел. Кури инкапсуляцию

      Уууу... И тут Остапа понесло :lool:
      Сообщение отредактировано: MyNameIsIgor -
        Цитата MyNameIsIgor @
        Чему это мешает то?


        Это оверхид ;) А потому - костыль. Мы же обходимся сразу вызовом виртуального метода для доступа к свойству, без посредника, и это в языке-то, который не на 100% объектно-ориентирован :D

        Цитата MyNameIsIgor @
        Для начала такой вопрос: можно ли в дельфи сделать геттер public, а сеттер - protected?


        Можно, а в C#? ;)

        Цитата MyNameIsIgor @
        Кто "мы"?


        Ты да я да мы с тобой

        Цитата MyNameIsIgor @
        В третий раз


        Я же в процитированном тобой сообщении написал:
        MyObj.Poinst[0] :=
        MyObj.Rects[0] :=
        Кстати, пометив свойство директивой default добиваемся того же, что и в шарпе, а именно
        MyObj[0] :=

        Добавлено
        Цитата MyNameIsIgor @
        Уууу... И тут Остапа понесло


        Я рад, что тебе на это нечего ответить по существу ;)
          Цитата --Ins-- @
          Это оверхид

          Ой, держите меня семеро :lool: Это говорит тот, кто для хэширования предлагал сериализовать экземпляр, ахахахахаха :lool:
          Цитата --Ins-- @
          Можно, а в C#?

          Даю три попытки отгадать.
          Цитата --Ins-- @
          Ты да я да мы с тобой

          Ну, вот и сразу могу сказать, что я то уж точно напишу лучше, ибо вы наверняка свойства сериализуете, прежде чем изменить :D
          Цитата --Ins-- @
          Я рад, что тебе на это нечего ответить по существу

          Я простой крестьянский парень и на сомнения в моём профессионализме отвечаю лицом к лицу :)
            Цитата MyNameIsIgor @
            Это говорит тот, кто для хэширования предлагал сериализовать экземпляр


            Тьфу, вспомнил, блин. Уже не предлагаю, успокойся ;)

            Цитата MyNameIsIgor @
            Ну, вот и сразу могу сказать, что я то уж точно напишу лучше, ибо вы наверняка свойства сериализуете, прежде чем изменить


            Чяво???? :D

            Давай, пиши, пример почти из моего примера, прошу прощения за тафталогию :) Чисто для демонстрации свойств
            Есть класс, который просто хранит две координаты - TRect. Нужно у этого класса завести много разных свойств, которые дадут доступ к этим координатам любым удобным способом, а именно:
            - свойства Left, Top, Right, Bottom
            - свойства LeftTop, RightBottom
            - свойство Points[Index: Integer]: Point, где Index - 0 для LeftTop и 1 для RightBottom
            - свойство Coords[Index: Integer]: Integer, где Index = 0..3 для Left, Top, Right, Bottom соответственно.

            Решение на Delphi:
            ExpandedWrap disabled
              type
                TPoint = record
                  X, Y: Integer;
                end;
               
                TRectCoords = record
                  case Integer of
                    0: (Points: array[0..1] of TPoint);
                    1: (Coords: array[0..3] of Integer);
                end;
               
              TRect = class
              private
                FCoords: TRectCoords;
                function GetCoord(Index: Integer): Integer;
                procedure SetCoord(Index: Integer; Value: Integer);
                function GetPoint(Index: Integer): TPoint;
                procedure SetPoint(Index: Integer; Value: TPoint);
              public
                property Left: Integer read GetCoord write SetCoord index 0;
                property Top: Integer read GetCoord write SetCoord index 1;
                property Right: Integer read GetCoord write SetCoord index 2;
                property Bottom: Integer read GetCoord write SetCoord index 3;
                property LeftTop: TPoint read GetPoint write SetPoint index 0;
                property RightBottom: TPoint read GetPoint write SetPoint index 1;
                property Coords[Index: Integer]: Integer read GetCoord write SetCoord;
                property Points[Index: Integer]: TPoint read GetPoint write SetPoint;
              end;
               
              function TRect.GetCoord(Index: Integer): Integer;
              begin
                Result := FCoords.Coords[Index];
              end;
               
              procedure TRect.SetCoord(Index: Integer; Value: Integer);
              begin
                FCoords.Coords[Index] := Value;
              end;
               
              function TRect.GetPoint(Index: Integer): TPoint;
              begin
                Result := FCoords.Points[Index];
              end;
               
              procedure TRect.SetPoint(Index: Integer; Value: TPoint);
              begin
                FCoords.Points[Index] := Value;
              end;


            Давай аналог на C#
              Цитата --Ins-- @
              Давай аналог на C#

              Надо было добавить ещё "я сказал" для пущего эффекта.
              А write only надо лечить
              Цитата MyNameIsIgor @
              Как будет происходить сравнение? По каким параметрам?
                MyNameIsIgor, да ты сначала реши эту архисложную задачу, требующую нетривиальных идей и реализаций, а там разберемся по каким параметрам сравнивать ;) Я код прямо сюда писал в силу его архисложности. А там - ты покритикуешь мою, а я - твою. Или спрыгиваешь? ;)
                  Цитата --Ins-- @
                  MyNameIsIgor, да ты сначала реши эту архисложную задачу

                  Зачем? Потому что вы изволили меня об этом попросить? Так плохо вы просите, волшебное слово забыли. И на колени встать :tong:
                  Цитата --Ins-- @
                  там разберемся по каким параметрам сравнивать

                  Да знаю я эти "параметры"... Наслушался уже Остапа.
                  Цитата --Ins-- @
                  Или спрыгиваешь?

                  А я и не запрыгивал :D
                    зачем мне работать с полем? Есть объект, ему посылаются сообщения. Причем тут свойства?
                      Цитата MyNameIsIgor @
                      Зачем? Потому что вы изволили меня об этом попросить?


                      Затем, чтобы ты понял что такое "нормальные свойства", о которых ты было САМ спросил :D Ну я думаю ты понял :D А вот и волшебные слова: cлив засчитан
                        Цитата --Ins-- @
                        А вот и волшебные слова: cлив засчитан

                        Закрываю над вами крышку унитаза :)
                          Язычок у тебя острый, я погляжу... А вот по части своего профессионализьма, который ты отстаиваешь лицом :D - не убедил.
                            Цитата --Ins-- @
                            В С++ ООП на зародышевом уровне

                            Ты всю соседнюю тему пытаешься это доказать, но у тебя так и не вышло. Свойства не имеют никакого отношения к ООП. Если не согласен, то пожалуйста предоставь ссылку на источник информации, с удовольствием обнаружу свои заблуждения :)
                            Вообще состояние объекта - его личное дело и очень редко нужно рассматривать объект исключительно как набор изменяемых атрибутов.

                            Добавлено
                            Цитата --Ins-- @
                            Нужно у этого класса завести много разных свойств, которые дадут доступ к этим координатам любым удобным способом, а именно:
                            - свойства Left, Top, Right, Bottom
                            - свойства LeftTop, RightBottom
                            - свойство Points[Index: Integer]: Point, где Index - 0 для LeftTop и 1 для RightBottom
                            - свойство Coords[Index: Integer]: Integer, где Index = 0..3 для Left, Top, Right, Bottom соответственно.

                            ОМГ. Зачем?

                            Добавлено
                            Цитата korvin @
                            зачем мне работать с полем? Есть объект, ему посылаются сообщения. Причем тут свойства?

                            +1
                              --Ins--, вы так жаждали, так жаждали :)
                              ExpandedWrap disabled
                                    class Indexer<TIndex, TValue>
                                    {
                                        private Func<TIndex, TValue> getter;
                                        private Action<TIndex, TValue> setter;
                                        public Indexer(Func<TIndex, TValue> getter, Action<TIndex, TValue> setter)
                                        {
                                            this.getter = getter;
                                            this.setter = setter;
                                        }
                                        public TValue this[TIndex i]
                                        {
                                            get { return getter(i); }
                                            set { setter(i, value); }
                                        }
                                    }
                                    
                                    struct Point
                                    {
                                        public int X, Y;
                                    }
                                    
                                    class Rectangle
                                    {
                                        private int[] coords = new int[4];
                                        private int GetCoord(int i) { return coords[i]; }
                                        private void SetCoord(int i, int value) { coords[i] = value; }
                                        private Point GetPoint(int i)
                                        {
                                            return new Point() { X = coords[i * 2], Y = coords[i * 2 + 1] };
                                        }
                                        private void SetPoint(int i, Point value)
                                        {
                                            coords[i * 2] = value.X;
                                            coords[i * 2 + 1] = value.Y;
                                        }
                                        public int Left
                                        {
                                            get { return GetCoord(0); }
                                            set { SetCoord(0, value); }
                                        }
                                        public int Top
                                        {
                                            get { return GetCoord(1); }
                                            set { SetCoord(1, value); }
                                        }
                                        public int Right
                                        {
                                            get { return GetCoord(2); }
                                            set { SetCoord(2, value); }
                                        }
                                        public int Bottom
                                        {
                                            get { return GetCoord(3); }
                                            set { SetCoord(3, value); }
                                        }
                                        public Point LeftTop
                                        {
                                            get { return GetPoint(0); }
                                            set { SetPoint(0, value); }
                                        }
                                        public Point RightBottom
                                        {
                                            get { return GetPoint(1); }
                                            set { SetPoint(1, value); }
                                        }
                                        public Indexer<int, int> Coords
                                        {
                                            get { return new Indexer<int, int>(i => GetCoord(i), (i, v) => SetCoord(i, v)); }
                                        }
                                        public Indexer<int, Point> Points
                                        {
                                            get { return new Indexer<int, Point>(i => GetPoint(i), (i, v) => SetPoint(i, v)); }
                                        }
                                    }

                              Кстати, вот так
                              ExpandedWrap disabled
                                MyObj.Points[0].X := 0;

                              работает?
                              Вот это что?
                              ExpandedWrap disabled
                                TRectCoords = record
                                    case Integer of
                                      0: (Points: array[0..1] of TPoint);
                                      1: (Coords: array[0..3] of Integer);
                                  end;

                              Недоunion? :)
                              Цитата --Ins-- @
                              Язычок у тебя острый, я погляжу...

                              Не надо на него смотреть, я стесняюсь :blush:
                              Цитата --Ins-- @
                              не убедил

                              Поверьте, я вас ни в чём не убеждал...

                              P.S. Теперь для оправдания названия темы хоть ещё и на плюсах пиши... Хех, а я хотел поужинать :(
                                MyNameIsIgor, немного не в тему вопрос, можно ли как-то заставить лямбду захватывать объект по мягкой ссылке?
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (495) « Первая ... 34 35 [36] 37 38 ...  494 495


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