На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела:
1. Название темы - краткое описание кто/что против кого/чего
2. В первом сообщении - список параметров, по которым идет сравнение.
3. Старайтесь аргументировать свои высказывания. Фразы типа "Венда/Слюникс - ацтой" считаются флудом.
4. Давайте жить дружно и не доводить обсуждение до маразма и личных оскорблений.
Модераторы: Модераторы, Комодераторы
Страницы: (495) « Первая ... 148 149 [150] 151 152 ...  494 495  ( Перейти к последнему сообщению )  
> Delphi vs C++ vs C# , ну и Java немножко, где-то ближе к старшему байту номеров страниц
    Цитата DesweR @
    2. Класс SuperClass сам реализовывает интерфейсы IA и IB, в этом случае мы разруливаем коллизию с наименованием методов.
    ExpandedWrap disabled
      type
        IA = interface
          procedure f;
        end;
       
        IB = interface
          procedure f;
        end;
       
       
        SuperClass = class(TInterfacedObject, IA, IB)
          procedure Af;
          procedure IA.f = Af;
          procedure Bf;
          procedure IB.f = Bf;
        end;
       
       
      procedure SuperClass.Af;
      begin
        ShowMessage( 'A.f' );
      end;
       
      procedure SuperClass.Bf;
      begin
        ShowMessage( 'B.f' );
      end;
       
       
      procedure f1 (const x : IA);
      begin
        x.f;
      end;
       
      procedure f2 (const x : IB);
      begin
        x.f;
      end;
       
      ...
       
      var
        x : SuperClass;
      begin
        x := SuperClass.Create;
        f1( x );
        f2( x );
      end;

    Вот это весьма неплохо. Я так понимаю, что так же можно сделать, если я захочу в наследнике B переопределить реализацию обоих интерфейсов? Но, всё же, хотелось бы, чтобы IB наследовался от IA:
    ExpandedWrap disabled
      #include <iostream>
       
      class IA
      {
      public:
        virtual void f() = 0;
      };
       
      class IB : public IA
      {
      public:
        virtual void g() = 0;
      };
       
      class A : public IA
      {
      public:
        virtual void f() { std::cout << "A::IA::f" << std::endl; }
      };
       
      class A_f : public A
      {
        virtual void f() { IA_f(); }
      public:
        virtual void IA_f() = 0;
      };
       
      class B_f : public IB
      {
        virtual void f() { IB_f(); }
      public:
        virtual void IB_f() = 0;
      };
       
      class B : public A_f, public B_f
      {
      public:
        virtual void IA_f() { A::f(); }
        virtual void IB_f() { std::cout << "B::IB::f" << std::endl; }
        virtual void g() { std::cout << "B::IB::g" << std::endl; }
      };
       
      class C : public B
      {
      public:
        virtual void IA_f() { std::cout << "C::IA::f" << std::endl; };
        virtual void IB_f() { std::cout << "C::IB::f" << std::endl; }
        virtual void g() { std::cout << "C::IB::g" << std::endl; }
      };
       
      void f1(IA& a)
      {
        a.f();
      }
       
      void f2(IB& b)
      {
        b.f();
        b.g();
      }
       
      int main()
      {
        B b;
        f1(static_cast<A&>(b));
        f2(static_cast<IB&>(b));
        
        C c;
        f1(static_cast<A&>(c));
        f2(static_cast<IB&>(c));
      }

    ExpandedWrap disabled
      A::IA::f
      B::IB::f
      B::IB::g
      C::IA::f
      C::IB::f
      C::IB::g


    korvin, ну, а вам могу предложить финт ушами с прокси объектом:
    ExpandedWrap disabled
      #include <iostream>
       
      class Int
      {
        int x_;
      public:
        explicit Int(int x = 0) : x_(x) {}
        int get() const { return x_; }
        void set(int x) { x_ = x; }
      };
       
      class A
      {
        class Proxy : Int
        {
          friend class A;
          Proxy() : Int() {}
          Proxy(const Int& t) : Int(t) {}
          Proxy(const Proxy& p) : Int(p) {}
          Proxy& operator= (const Proxy& p) { static_cast<Int&>(*this) = static_cast<const Int&>(p); }
          ~Proxy() {}
        public:
          using Int::get;
          using Int::set;
        };
      public:
        Proxy x, y, z;
      };
       
      int main()
      {
        A a;
        a.x.set(10);
        a.y.set(15);
        a.z.set(20);
        std::cout << "x=" << a.x.get() << " y=" << a.y.get() << " z=" << a.z.get() << std::endl;
      }

    ExpandedWrap disabled
      x=10 y=15 z=20
    Сообщение отредактировано: MyNameIsIgor -
      Цитата korvin @
      в делфи as служит для приведения интерфейса класса к интерфейсу субкласса, точнее для возврата утерянной информации о классе, когда мы TSome передаем в подпрограмму или контейнер, ожидающий TObject например

      Можно и так сказать, дополню, что при использовании оператора as генерируется исключение в случае когда классы объектов "несовместимы". В случае же с интерфейсами, as используется для получения, простите за тавтологию, интерфейсов (через неявный вызов QueryInterface).

      Цитата korvin @
      не совсем. Как я понял

      Это не документировано, но вообще на VTM класса реализующего интерфейсы наслаивается VTM этих интерфейсов, при не явном приведении, т.е. без оператора as, без запросов интерфейса, компилятор каким-то там образом разруливает эту ситуацию.
        Цитата korvin @
        не совсем. Как я понял

        C#: TSome as TObject
        Delphi: TObject as TSome


        Чего ? :) Приводить же в обе стороны можно и там и там. Или в делфи нельзя ?

        Добавлено
        Я имею в виду, если объект - экземпляр наследника.
          MyNameIsIgor
          Сломал моск :D

          Добавлено
          Цитата IL_Agent @
          Приводить же в обе стороны можно и там и там. Или в делфи нельзя ?

          Можно, в случае от предка к наследнику - явно.
          Сообщение отредактировано: DesweR -
            Цитата MyNameIsIgor @
            korvin, ну, а вам могу предложить финт ушами с прокси объектом:

            финт удался, жаль, что ради такой мелочи нужно городить такую кучу мусора. может прокси-класс в шаблон как-то можно оформить?
              Цитата MyNameIsIgor @
              ExpandedWrap disabled
                #include <iostream>
                 
                class Int
                {
                  int x_;
                public:
                  explicit Int(int x = 0) : x_(x) {}
                  int get() const { return x_; }
                  void set(int x) { x_ = x; }
                };
                 
                class A
                {
                  class Proxy : Int
                  {
                    friend class A;
                    Proxy() : Int() {}
                    Proxy(const Int& t) : Int(t) {}
                    Proxy(const Proxy& p) : Int(p) {}
                    Proxy& operator= (const Proxy& p) { static_cast<Int&>(*this) = static_cast<const Int&>(p); }
                    ~Proxy() {}
                  public:
                    using Int::get;
                    using Int::set;
                  };
                public:
                  Proxy x, y, z;
                };
                 
                int main()
                {
                  A a;
                  a.x.set(10);
                  a.y.set(15);
                  a.z.set(20);
                  std::cout << "x=" << a.x.get() << " y=" << a.y.get() << " z=" << a.z.get() << std::endl;
                }

              Где нужно подпилить, чтобы это собралось в MinGW?
              Цитата
              ..\untitled15\main.cpp: In member function 'A::Proxy& A::Proxy::operator=(const A::Proxy&)':

              ..\untitled15\main.cpp:21: warning: no return statement in function returning non-void

              ..\untitled15\main.cpp: In function 'int main(int, char**)':

              ..\untitled15\main.cpp:35: error: conflicting declaration 'A a'

              ..\untitled15\main.cpp:33: error: 'a' has a previous declaration as 'QCoreApplication a'

              ..\untitled15\main.cpp:36: error: 'class QCoreApplication' has no member named 'x'

              ..\untitled15\main.cpp:37: error: 'class QCoreApplication' has no member named 'y'

              ..\untitled15\main.cpp:38: error: 'class QCoreApplication' has no member named 'z'

              ..\untitled15\main.cpp:39: error: 'class QCoreApplication' has no member named 'x'

              ..\untitled15\main.cpp:39: error: 'class QCoreApplication' has no member named 'y'

              ..\untitled15\main.cpp:39: error: 'class QCoreApplication' has no member named 'z'
                Цитата DesweR @
                ..\untitled15\main.cpp:35: error: conflicting declaration 'A a'

                ..\untitled15\main.cpp:33: error: 'a' has a previous declaration as 'QCoreApplication a'

                У тебя как с английским?
                А вообще хочу тебе сделать комплимент... Твои посты стали лучше: содержательнее и сдержаннее. И спасибо за некоторые дополнительные разъяснения по интерфейсам.
                  Цитата DesweR @
                  Где нужно подпилить, чтобы это собралось в MinGW?
                  Попробовать не добавлять отсебятину, не имея для этого достаточной квалификации?
                  И в Proxy& operator= (const Proxy& p) добавить return

                  P.S. Там в сообщениях об ошибках все однозначно написано.

                  Добавлено
                  Цитата D_KEY @
                  Твои посты стали лучше: содержательнее и сдержаннее.
                  Так он прямо в этой теме и учится :)
                    Да, ошибся. Вместо
                    ExpandedWrap disabled
                      Proxy& operator= (const Proxy& p) { static_cast<Int&>(*this) = static_cast<const Int&>(p); }

                    надо
                    ExpandedWrap disabled
                          Proxy& operator= (const Proxy& p)
                          {
                            static_cast<Int&>(*this) = static_cast<const Int&>(p);
                            return *this;
                          }

                    А вот ошибки с QCoreApplication я не понял... Вы Qt что ли прикрутили?
                    Цитата korvin @
                    финт удался, жаль, что ради такой мелочи нужно городить такую кучу мусора. может прокси-класс в шаблон как-то можно оформить?

                    Я думаю над этим :)
                      MyNameIsIgor, мне не нравится такая работа со скрытыми декларациями :)
                      Кроме того, ты все-равно оставляешь возможность изменения поля без объекта-владельца, хотя ты и сделал класс поля скрытым ;)

                      Добавлено
                      Чтобы долго не думалось, подскажу:
                      ExpandedWrap disabled
                        template<typename T, typename DataT>
                        T &assign(T &ref, const DataT &value)
                        {
                            ref.set(value);
                            return ref;
                        }


                      Так что тз оно не удовлетворяет... Я вчера еще подумывал, как можно это все запретить, но пока не придумал.
                        Цитата trainer @
                        И в Proxy& operator= (const Proxy& p) добавить return

                        Точно. C++ Builder кстати просто выдал предупреждение, но скомпилировал.

                        Цитата MyNameIsIgor @
                        А вот ошибки с QCoreApplication я не понял... Вы Qt что ли прикрутили?

                        Да, стоит.

                        Цитата D_KEY @
                        А вообще хочу тебе сделать комплимент... Твои посты стали лучше: содержательнее и сдержаннее.

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

                        Цитата D_KEY @
                        И спасибо за некоторые дополнительные разъяснения по интерфейсам.

                        Да не за что :)

                        MyNameIsIgor
                        А экземпляр Proxy никак нельзя скастить к Int?
                          Цитата D_KEY @
                          MyNameIsIgor, мне не нравится такая работа со скрытыми декларациями

                          Нуу... Дело вкуса :) Я тоже не сказать, что в восторге. Но ничего ужасного не вижу.
                          Цитата D_KEY @
                          Кроме того, ты все-равно оставляешь возможность изменения поля без объекта-владельца, хотя ты и сделал класс поля скрытым

                          Данной мне подсказки недостаточно :)

                          Добавлено
                          Цитата DesweR @
                          MyNameIsIgor
                          А экземпляр Proxy никак нельзя скастить к Int?

                          Может сам Proxy или A.

                          Добавлено
                          Ну, грязные хаки я не считаю.

                          Добавлено
                          А, D_KEY, понял, ты про то, что можно передать ссылку на Proxy. Ну, да, конечно. Если честно, то я вообще не подумал, что это следует запретить... А надо, да? :)
                            Цитата MyNameIsIgor @
                            Цитата D_KEY @
                            Кроме того, ты все-равно оставляешь возможность изменения поля без объекта-владельца, хотя ты и сделал класс поля скрытым

                            Данной мне подсказки недостаточно :)

                            Ну я о том, что в эту функцию ты можешь предать поле.
                            ExpandedWrap disabled
                              assign(a.x, 111);

                            То есть использовать явно A::Proxy ты не можешь, а вот косвенно или через шаблоны - пожалуйста.

                            Добавлено
                            Цитата MyNameIsIgor @
                            Ну, да, конечно. Если честно, то я вообще не подумал, что это следует запретить... А надо, да? :)

                            Ну вообще korvin хотел, чтобы иначе, как через a.x.set и a.x.get получить доступ к x было бы нельзя. А ты знаешь как запретить?

                            Добавлено
                            Цитата DesweR @
                            Цитата trainer @
                            И в Proxy& operator= (const Proxy& p) добавить return

                            Точно. C++ Builder кстати просто выдал предупреждение, но скомпилировал.

                            Ну так и у тебя ошибки идут не от этого кода.

                            Цитата
                            Цитата D_KEY @
                            А вообще хочу тебе сделать комплимент... Твои посты стали лучше: содержательнее и сдержаннее.

                            Мои посты не изменились и заканчивай свой нано-троллинг, будь сдержаннее.
                            Вот не в сдержанности меня давно не обвиняли, любопытно :)
                            А посты твои стили лучше :tong:
                            Сообщение отредактировано: D_KEY -
                              Цитата D_KEY @
                              Ну вообще korvin хотел, чтобы иначе, как через a.x.set и a.x.get получить доступ к x было бы нельзя.

                              Странно... По идее, если мы передаём куда-то ссылку/указатель на Proxy, то подразумевается, что экземпляр A существует. И потом, даже имею эту ссылку/указатель, мы всё равно ничего не можем сделать с x, кроме того, что сами разрешили.
                              Цитата D_KEY @
                              А ты знаешь как запретить?

                              Есть бредовая мысль, которая тебе не понравится ещё больше махинаций с private декларациями :) Надо подумать и почитать.
                                Цитата D_KEY @
                                Ну так и у тебя ошибки идут не от этого кода.

                                Тьфу ты, там тоже варнинг, я там не вникал, уже без пяти минут было - домой собирался.
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (495) « Первая ... 148 149 [150] 151 152 ...  494 495


                                Рейтинг@Mail.ru
                                [ Script execution time: 0.2735 ]   [ 14 queries used ]   [ Generated: 31.07.26, 08:34 GMT ]