Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.156] |
|
|
Правила раздела:
| Страницы: (495) « Первая ... 148 149 [150] 151 152 ... 494 495 ( Перейти к последнему сообщению ) |
Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
|
Сообщ.
#2236
,
|
|
|
|
Цитата DesweR @ 2. Класс SuperClass сам реализовывает интерфейсы IA и IB, в этом случае мы разруливаем коллизию с наименованием методов. ![]() ![]() 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: ![]() ![]() #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)); } ![]() ![]() A::IA::f B::IB::f B::IB::g C::IA::f C::IB::f C::IB::g korvin, ну, а вам могу предложить финт ушами с прокси объектом: ![]() ![]() #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; } ![]() ![]() x=10 y=15 z=20 |
|
Сообщ.
#2237
,
|
|
|
|
Цитата korvin @ в делфи as служит для приведения интерфейса класса к интерфейсу субкласса, точнее для возврата утерянной информации о классе, когда мы TSome передаем в подпрограмму или контейнер, ожидающий TObject например Можно и так сказать, дополню, что при использовании оператора as генерируется исключение в случае когда классы объектов "несовместимы". В случае же с интерфейсами, as используется для получения, простите за тавтологию, интерфейсов (через неявный вызов QueryInterface). Это не документировано, но вообще на VTM класса реализующего интерфейсы наслаивается VTM этих интерфейсов, при не явном приведении, т.е. без оператора as, без запросов интерфейса, компилятор каким-то там образом разруливает эту ситуацию. |
|
Сообщ.
#2238
,
|
|
|
|
Чего ? Приводить же в обе стороны можно и там и там. Или в делфи нельзя ? Добавлено Я имею в виду, если объект - экземпляр наследника. |
|
Сообщ.
#2239
,
|
|
|
|
MyNameIsIgor
Сломал моск Добавлено Цитата IL_Agent @ Приводить же в обе стороны можно и там и там. Или в делфи нельзя ? Можно, в случае от предка к наследнику - явно. |
|
Сообщ.
#2240
,
|
|
|
|
Цитата MyNameIsIgor @ korvin, ну, а вам могу предложить финт ушами с прокси объектом: финт удался, жаль, что ради такой мелочи нужно городить такую кучу мусора. может прокси-класс в шаблон как-то можно оформить? |
|
Сообщ.
#2241
,
|
|
|
|
Цитата MyNameIsIgor @ ![]() ![]() #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' |
|
Сообщ.
#2242
,
|
|
|
|
Цитата DesweR @ ..\untitled15\main.cpp:35: error: conflicting declaration 'A a' ..\untitled15\main.cpp:33: error: 'a' has a previous declaration as 'QCoreApplication a' У тебя как с английским? А вообще хочу тебе сделать комплимент... Твои посты стали лучше: содержательнее и сдержаннее. И спасибо за некоторые дополнительные разъяснения по интерфейсам. |
|
Сообщ.
#2243
,
|
|
|
|
Цитата DesweR @ Попробовать не добавлять отсебятину, не имея для этого достаточной квалификации?Где нужно подпилить, чтобы это собралось в MinGW? И в Proxy& operator= (const Proxy& p) добавить return P.S. Там в сообщениях об ошибках все однозначно написано. Добавлено Цитата D_KEY @ Так он прямо в этой теме и учится Твои посты стали лучше: содержательнее и сдержаннее. |
|
Сообщ.
#2244
,
|
|
|
|
Да, ошибся. Вместо
![]() ![]() Proxy& operator= (const Proxy& p) { static_cast<Int&>(*this) = static_cast<const Int&>(p); } надо ![]() ![]() Proxy& operator= (const Proxy& p) { static_cast<Int&>(*this) = static_cast<const Int&>(p); return *this; } А вот ошибки с QCoreApplication я не понял... Вы Qt что ли прикрутили? Цитата korvin @ финт удался, жаль, что ради такой мелочи нужно городить такую кучу мусора. может прокси-класс в шаблон как-то можно оформить? Я думаю над этим |
|
Сообщ.
#2245
,
|
|
|
|
MyNameIsIgor, мне не нравится такая работа со скрытыми декларациями
Кроме того, ты все-равно оставляешь возможность изменения поля без объекта-владельца, хотя ты и сделал класс поля скрытым Добавлено Чтобы долго не думалось, подскажу: ![]() ![]() template<typename T, typename DataT> T &assign(T &ref, const DataT &value) { ref.set(value); return ref; } Так что тз оно не удовлетворяет... Я вчера еще подумывал, как можно это все запретить, но пока не придумал. |
|
Сообщ.
#2246
,
|
|
|
|
Цитата trainer @ И в Proxy& operator= (const Proxy& p) добавить return Точно. C++ Builder кстати просто выдал предупреждение, но скомпилировал. Цитата MyNameIsIgor @ А вот ошибки с QCoreApplication я не понял... Вы Qt что ли прикрутили? Да, стоит. Цитата D_KEY @ А вообще хочу тебе сделать комплимент... Твои посты стали лучше: содержательнее и сдержаннее. Мои посты не изменились и заканчивай свой нано-троллинг, будь сдержаннее. Цитата D_KEY @ И спасибо за некоторые дополнительные разъяснения по интерфейсам. Да не за что MyNameIsIgor А экземпляр Proxy никак нельзя скастить к Int? |
|
Сообщ.
#2247
,
|
|
|
|
Цитата D_KEY @ MyNameIsIgor, мне не нравится такая работа со скрытыми декларациями Нуу... Дело вкуса Я тоже не сказать, что в восторге. Но ничего ужасного не вижу.Цитата D_KEY @ Кроме того, ты все-равно оставляешь возможность изменения поля без объекта-владельца, хотя ты и сделал класс поля скрытым Данной мне подсказки недостаточно Добавлено Цитата DesweR @ MyNameIsIgor А экземпляр Proxy никак нельзя скастить к Int? Может сам Proxy или A. Добавлено Ну, грязные хаки я не считаю. Добавлено А, D_KEY, понял, ты про то, что можно передать ссылку на Proxy. Ну, да, конечно. Если честно, то я вообще не подумал, что это следует запретить... А надо, да? |
|
Сообщ.
#2248
,
|
|
|
|
Цитата MyNameIsIgor @ Цитата D_KEY @ Кроме того, ты все-равно оставляешь возможность изменения поля без объекта-владельца, хотя ты и сделал класс поля скрытым Данной мне подсказки недостаточно ![]() Ну я о том, что в эту функцию ты можешь предать поле. ![]() ![]() 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 @ А вообще хочу тебе сделать комплимент... Твои посты стали лучше: содержательнее и сдержаннее. Мои посты не изменились и заканчивай свой нано-троллинг, будь сдержаннее. А посты твои стили лучше |
|
Сообщ.
#2249
,
|
|
|
|
Цитата D_KEY @ Ну вообще korvin хотел, чтобы иначе, как через a.x.set и a.x.get получить доступ к x было бы нельзя. Странно... По идее, если мы передаём куда-то ссылку/указатель на Proxy, то подразумевается, что экземпляр A существует. И потом, даже имею эту ссылку/указатель, мы всё равно ничего не можем сделать с x, кроме того, что сами разрешили. Цитата D_KEY @ А ты знаешь как запретить? Есть бредовая мысль, которая тебе не понравится ещё больше махинаций с private декларациями Надо подумать и почитать. |
|
Сообщ.
#2250
,
|
|
|
|
Цитата D_KEY @ Ну так и у тебя ошибки идут не от этого кода. Тьфу ты, там тоже варнинг, я там не вникал, уже без пяти минут было - домой собирался. |