Сообщение Re[2]: Недоучки по настоящему ООП не освоили (из-за Basic и от 01.09.2025 10:08
Изменено 01.09.2025 10:32 rg45
Re[2]: Недоучки по настоящему ООП не освоили (из-за Basic и
Здравствуйте, so5team, Вы писали:
S>Что до желания обсудить настоящесть ООП, предлагаю рассмотреть реализацию такого примера (псевдокод в синтаксисе a la C++, но на C++ это не реализуется):
S> . . .
Обходится добавлением пары промежуточных классов в иерархию наследования (если по каким-то причинам нам недоступно переименование методов в базовых классах).
И я бы не сказал, что это какая-то широкораспространённая проблема, которая создаёт массовые неудобства. Думаю, если бы это было так, то эту возможность давно бы уже добавили. Но насколько я могу судить, С++ развивается в другом направлении.
http://coliru.stacked-crooked.com/a/a2a51e9929bb5286
S>Что до желания обсудить настоящесть ООП, предлагаю рассмотреть реализацию такого примера (псевдокод в синтаксисе a la C++, но на C++ это не реализуется):
S> . . .
Обходится добавлением пары промежуточных классов в иерархию наследования (если по каким-то причинам нам недоступно переименование методов в базовых классах).
И я бы не сказал, что это какая-то широкораспространённая проблема, которая создаёт массовые неудобства. Думаю, если бы это было так, то эту возможность давно бы уже добавили. Но насколько я могу судить, С++ развивается в другом направлении.
http://coliru.stacked-crooked.com/a/a2a51e9929bb5286
#include <iostream>
struct A {
virtual void f() { std::cout << "A::f" << std::endl; }
};
struct B {
virtual void f() { std::cout << "B::f" << std::endl; }
};
void consume_A(A & o) { o.f(); /* Здесь вызывается f из A */ }
void consume_B(B & o) { o.f(); /* Здесь вызывается f из B */ }
struct A_Adaptor : A {
virtual void f_a() = 0;
void f() override { f_a(); }
};
struct B_Adaptor : B {
virtual void f_b() = 0;
void f() override { f_b(); }
};
struct D : A_Adaptor, B_Adaptor
{
void f_a() override {
std::cout << "D's f from A" << std::endl;
A::f();
}
void f_b() override {
std::cout << "D's f from B" << std::endl;
B::f();
}
};
int main() {
D d;
consume_A(d);
consume_B(d);
}D's f from A
A::f
D's f from B
B::fRe[2]: Недоучки по настоящему ООП не освоили (из-за Basic и
Здравствуйте, so5team, Вы писали:
S>Что до желания обсудить настоящесть ООП, предлагаю рассмотреть реализацию такого примера (псевдокод в синтаксисе a la C++, но на C++ это не реализуется):
S> . . .
Обходится добавлением пары промежуточных классов в иерархию наследования (если по каким-то причинам нам недоступно переименование методов в базовых классах).
Думаю, этот недостаток давно бы уже восполнили, если бы это создавало какие-то массовые неудобства. Но, насколько я могу судить, С++ развивается в другом направлении.
http://coliru.stacked-crooked.com/a/a2a51e9929bb5286
S>Что до желания обсудить настоящесть ООП, предлагаю рассмотреть реализацию такого примера (псевдокод в синтаксисе a la C++, но на C++ это не реализуется):
S> . . .
Обходится добавлением пары промежуточных классов в иерархию наследования (если по каким-то причинам нам недоступно переименование методов в базовых классах).
Думаю, этот недостаток давно бы уже восполнили, если бы это создавало какие-то массовые неудобства. Но, насколько я могу судить, С++ развивается в другом направлении.
http://coliru.stacked-crooked.com/a/a2a51e9929bb5286
#include <iostream>
struct A {
virtual void f() { std::cout << "A::f" << std::endl; }
};
struct B {
virtual void f() { std::cout << "B::f" << std::endl; }
};
void consume_A(A & o) { o.f(); /* Здесь вызывается f из A */ }
void consume_B(B & o) { o.f(); /* Здесь вызывается f из B */ }
struct A_Adaptor : A {
virtual void f_a() = 0;
void f() override { f_a(); }
};
struct B_Adaptor : B {
virtual void f_b() = 0;
void f() override { f_b(); }
};
struct D : A_Adaptor, B_Adaptor
{
void f_a() override {
std::cout << "D's f from A" << std::endl;
A::f();
}
void f_b() override {
std::cout << "D's f from B" << std::endl;
B::f();
}
};
int main() {
D d;
consume_A(d);
consume_B(d);
}D's f from A
A::f
D's f from B
B::f