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

    "Свойства" обеспечивают управление доступом к внутреннему состоянию объекта и тривиальной связкой методов "читать/писать", как ты полагаешь, они не ограничиваются.

    "Свойства" можно переопределять и редекларировать в производных классах:
    ExpandedWrap disabled
        TAncestor = class
        private
          FCaption: string;
          FLength: Integer;
        protected
          property Caption: string read FCaption;
          property Length: Integer read FLength;
        end;
       
        TDerived1 = class(TAncestor)
        public
          property Caption;
          property Length;
        end;
       
        TDerived2 = class(TDerived1)
        private
          function GetCaption: string;
        public
          property Caption: string read GetCaption;
        end;
       
        TDerived3 = class(TDerived2)
        private
          function NewGetCaption: string;
        public
          property Caption: string read NewGetCaption;
        end;
       
        TDerived4 = class(TDerived3)
        private
          procedure SetLength(const ALength: Integer);
        public
          property Caption write FCaption;
          property Length write SetLength;
        end;
       
        TDerived5 = class(TDerived4)
        published
          property Caption;
          property Length default 100;
        end;
       
        TDerived6 = class(TDerived5)
        published
          property Length default 50;
        end;

    И заметь, независимо от изменений внутренней реализации - публичный интерфейс остаётся неизменным и всё ясно отражает.

    Добавлено
    Полный перечень тут.
      Цитата scorpion @
      Если у вон того полудуплексного парня возникли проблемы, то этот полудуплексный парень начинает курить код, если код его не вставляет, то идет ко мне, я ему объясняю что к чему и как
      И вся эта идиллия внезапно обрывается на фразе "работа того парня давно сделана и оплачена"
        Цитата D_KEY @
        И удивляться, почему при чтении свойства полулили не то значение, что устанавливали?

        Ну, тут ты прав.

        Цитата D_KEY @
        Вот почему-то примеры на свойства чаще всего связаны именно с GUI...

        Потому что там примеры наиболее показательны и доступны для понимания. :)

        Цитата D_KEY @
        Почему вообще не сделать набор атрибутов для такого рода "классов" в виде структуры? Зачем себя обманывать и делать вид, что имеет место быть какая-то инкапсуляция, если практически весь объект представляет собой просто набор атрибутов?

        А потому что далеко не все свойства - именно "атрибуты". У тебя, условно, GetCaption/SetCaption может отображаться непосредственно на WinAPI-шные GetWindowText/SetWindowText. Как ты это в структуру запихнёшь? Какой-нибудь BoundingRect для окна непрямоугольной формы - это отдельная тема. В классе хранится какой-нибудь HREGION на регион, описывающий форму, а на вызове GetBoundingRect у этого региона запрашивают его текущий ограничивающий прямоугольник. Думаю, идея понятна. Тот набор атрибутов, которые видит клиент, лишь отражение некоторого внутреннего состояния объекта, и может быть совсем не идентичен ему.

        Вот тебе другой пример. Предположим, есть следующая модель. Некая игра. В игре есть визарды, у визардов есть юниты. Декларация класса визарда может выглядеть следующим образом (на условном C++-подобном синтаксисе):

        ExpandedWrap disabled
          class Unit;
           
          class Wizard
          {
          public:
             property size_t TotalUnits {get {return m_Units.size();} }
             property lazy_list<Unit*> Units {get {return make_lazy_list(m_Units.begin(), m_Units.end());}}
           
             void AddUnit(Unit* unit) {m_Units.push_back();}
             void RemoveUnit(Unit* unit) {m_Units.erase(std::find(m_Units.begin(), m_Units.end(), unit);}
           
          private:
             std::vector<Unit*> m_Units;
          };

        Здесь, как ты можешь заметить, внутреннее состояние класса (его внутренняя атрибутика) представлена совсем не так, как это выглядит для клиента.

        Цитата D_KEY @
        Почему бы не существовать объекту "текста", который бы делал бы всю работу по хранению и работы с текстом, и отдельному объекту, который бы умел отображать текст нужного размера, шрифта и т.п. Зачем нужно все валить в одну кучу? Я, конечно, с ГУИ уже работаю очень мало, но все-время как ни посмотрю в его сторону, у меня стабильно возникает ощущение, что что-то там не так...

        В какой-то момент ты дойдёшь до операции биндинга представления и модели, и будешь решать ту же проблему. :)
          Цитата scorpion @
          D_KEY, кстати ссылочку можно кинуть плз? а то в предыдущем посте есть инфа типа ссылка на вики, а ссылки(физической) нема
          Я об этом:
          :(
          Цитата D_KEY @
          Languages that support multiple inheritance include: C++, Common Lisp (via CLOS), EuLisp (via The EuLisp Object System TELOS), Curl, Dylan, Eiffel, Logtalk, Object REXX, Scala (via the use of mixin classes), OCaml, Perl, Perl 6, Python, and Tcl (via Incremental Tcl).[1]

          Other object-oriented languages, such as Java and Ruby implement single inheritance, although protocols, or "interfaces," provide some of the functionality of true multiple inheritance.

          http://en.wikipedia.org/wiki/Multiple_inheritance
            Цитата Qraizer @
            Romkin, их никто и не путает. Вот сейчас ты только что сказал, что наследование интерфейсов - это говнодизайн. Я правильно понял?

            При чем здесь дизайн? Как раз с интерфейсами все и хорошо, в отличие от множественного наследования. Если кто-то не знает принципов окромя примитивных объектов С++, то конечно будет говнодизайнить, вопросов нет.

            Добавлено
            Цитата Qraizer @
            Romkin, их никто и не путает. Вот сейчас ты только что сказал, что наследование интерфейсов - это говнодизайн. Я правильно понял?

            При чем здесь дизайн? Как раз с интерфейсами все и хорошо, в отличие от множественного наследования. Если кто-то не знает принципов окромя примитивных объектов С++, то конечно будет говнодизайнить, вопросов нет.
            Цитата korvin @
            и куда деваются элементы, оставшиеся вне диапазона, при уменьшении размера?

            Уничтожаются. И не надо говорить, что ужас-ужас :)
              Цитата Flex Ferrum @
              Цитата D_KEY @
              Почему вообще не сделать набор атрибутов для такого рода "классов" в виде структуры? Зачем себя обманывать и делать вид, что имеет место быть какая-то инкапсуляция, если практически весь объект представляет собой просто набор атрибутов?

              А потому что далеко не все свойства - именно "атрибуты". У тебя, условно, GetCaption/SetCaption может отображаться непосредственно на WinAPI-шные GetWindowText/SetWindowText. Как ты это в структуру запихнёшь? Какой-нибудь BoundingRect для окна непрямоугольной формы - это отдельная тема. В классе хранится какой-нибудь HREGION на регион, описывающий форму, а на вызове GetBoundingRect у этого региона запрашивают его текущий ограничивающий прямоугольник. Думаю, идея понятна. Тот набор атрибутов, которые видит клиент, лишь отражение некоторого внутреннего состояния объекта, и может быть совсем не идентичен ему.

              Есть ли просто с со всеми нужными "настройками", работать как со структурой? А уже ее мы передаем нашему объекту, чтобы он взял из нее какие-то данные?

              Цитата
              Вот тебе другой пример. Предположим, есть следующая модель. Некая игра. В игре есть визарды, у визардов есть юниты. Декларация класса визарда может выглядеть следующим образом (на условном C++-подобном синтаксисе):

              ExpandedWrap disabled
                class Unit;
                 
                class Wizard
                {
                public:
                   property size_t TotalUnits {get {return m_Units.size();} }
                   property lazy_list<Unit*> Units {get {return make_lazy_list(m_Units.begin(), m_Units.end());}}
                 
                   void AddUnit(Unit* unit) {m_Units.push_back();}
                   void RemoveUnit(Unit* unit) {m_Units.erase(std::find(m_Units.begin(), m_Units.end(), unit);}
                 
                private:
                   std::vector<Unit*> m_Units;
                };

              Здесь, как ты можешь заметить, внутреннее состояние класса (его внутренняя атрибутика) представлена совсем не так, как это выглядит для клиента.

              В чем здесь преимущества по сравнению с методами?

              Добавлено
              Цитата OpenGL @
              Цитата D_KEY @
              Почему бы не существовать объекту "текста", который бы делал бы всю работу по хранению и работы с текстом, и отдельному объекту, который бы умел отображать текст нужного размера, шрифта и т.п.
              Ты не поверишь, но сейчас ты описал TLabel, отображающий текст и его свойство Caption :)

              Нет. В TLabel все свалено в одну кучу.
                Цитата D_KEY @

                Все, можно сказать, наоборот. Интерфейсы появились как средство, необходимое в языке с запретом множественного наследования. Если множественное наследование разрешено, то в интерфейсах(в том виде, что они есть в Delphi/C#/Java) просто нет необходимости.

                Не знаю, как в Java, но в шарпе интерфейсы очень сильно отличаются (по семантике и реализации) от абстрактных классов. Всё-таки (тут я соглашусь с scorpion'ом) интерфейс описывает ожидаемое клиентом поведение. Кто и как это поведение реализует - клиента мало беспокоит. Главное, чтобы контракт соблюдался. Так вот, если посмотреть на шарп (и .Net вообще), то можно увидеть следующие тонкости в реализации интерфейсов:
                - Не имеет значение, сколько раз и как наследуется интерфейс.
                - В реализации методов интерфейса учавствует не только концевой класс, но и все его базы.
                Последний принцип проще пояснить на примере:
                ExpandedWrap disabled
                  public interface IFoo
                  {
                     void Foo();
                     void Bar();
                  }
                   
                  public class Base
                  {
                     public void Foo() {/* something */}
                  }
                   
                  public class Derived : Base, IFoo
                  {
                     public void Bar() {/* something else */}
                  }

                Интерфейс IFoo при такой схеме будет считаться полностью реализованным.

                Для сравнения достаточно посмотреть на COM - как там "удобно" работать с интерфейсами, и какие там жесткие правила реализации в объекте одновременно нескольких интерфейсов.

                По этому абстрактные классы нельзя считать полноценной заменой интерфейсам. По крайней мере, в некоторых языках.
                  Цитата Flex Ferrum @
                  Цитата (D_KEY @ Вчера, 23:14)
                  И удивляться, почему при чтении свойства полулили не то значение, что устанавливали?

                  Ну, тут ты прав.

                  А я вот не понимаю. Иногда - да, получается, что равносильно "дайте в метод значение, которое хотите, а метод вернет то, которое получилось". Но это редкость, а не правило. Как правило либо устанавливается что нужно либо исключение.
                    Цитата D_KEY @
                    Есть ли просто с со всеми нужными "настройками", работать как со структурой? А уже ее мы передаем нашему объекту, чтобы он взял из нее какие-то данные?

                    Это не так удобно, как кажется на первый взгляд.

                    Цитата D_KEY @

                    В чем здесь преимущества по сравнению с методами?

                    Эммм... Удобство и более точное отражение того, как это выглядит в "реальном мире". ;)
                      Цитата D_KEY @
                      Нет. В TLabel все свалено в одну кучу.

                      Поклеп. ТАм есть отдельный объект, "который обестечивает хранение и работу с текстом", string :)
                        Цитата Flex Ferrum @
                        Не знаю, как в Java, но в шарпе интерфейсы очень сильно отличаются (по семантике и реализации) от абстрактных классов.

                        Безусловно. Речь не об этом. Если в языке есть множественное наследование и абстрактные классы, то потребности в семантике интерфейсов не возникает.
                          Цитата D_KEY @
                          Если в языке есть множественное наследование и абстрактные классы, то потребности в семантике интерфейсов не возникает.

                          Зависит от этой семантики. Вот я не отказался бы от семантики интерфейсов в стиле C#. ;) Потому что прекрасно (на своём собственном опыте) знаю, как выглядит то же самое, но в рукопашную и на абстрактных классах. :)
                            Цитата D_KEY @
                            Есть ли просто с со всеми нужными "настройками", работать как со структурой? А уже ее мы передаем нашему объекту, чтобы он взял из нее какие-то данные?

                            А вот такой подход мне кажется грубым нарушением принципов проектирования, из-за "каких-то данных". Получается, есть структура, а объект может из нее брать что-то, а что-то - не брать или это будет брать другой объект? Фу.
                              Цитата Romkin @
                              Цитата D_KEY @
                              Нет. В TLabel все свалено в одну кучу.

                              Поклеп. ТАм есть отдельный объект, "который обестечивает хранение и работу с текстом", string :)

                              Я о композиции, используемой в данном классе.

                              Добавлено
                              Qraizer, кстати, обрати внимание на пост Flex'а про интерфейсы. Это так же отвечает на твои вопросы.

                              Добавлено
                              Цитата Flex Ferrum @
                              Эммм... Удобство и более точное отражение того, как это выглядит в "реальном мире". ;)

                              В "реальном мире" визард, как я понимаю, не хранит юнитов, а лишь порождает их в некоторые моменты времени. Или нет?
                                Цитата D_KEY @
                                Я о композиции, используемой в данном классе.

                                Исторически сложилось. Во-первых, в API так и получается, во-вторых - быстро. Кстати, а чем принципиально QLabel отличается, например?
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (495) « Первая ... 293 294 [295] 296 297 ...  494 495


                                Рейтинг@Mail.ru
                                [ Script execution time: 0.4348 ]   [ 14 queries used ]   [ Generated: 1.08.26, 06:44 GMT ]