Supposons que j'ai la classe
class A {
protected:
int x,y;
double z,w;
public:
void foo();
void bar();
void baz();
};
définis et utilisés dans mon code et celui des autres. Maintenant, je veux écrire une bibliothèque qui pourrait très bien opérer sur les A, mais qui est en fait plus générale, et qui serait capable d'opérer sur :
class B {
protected:
int y;
double z;
public:
void bar();
};
et je veux que ma bibliothèque soit générale, donc je définis une classe B et c'est ce que prennent ses API.
J'aimerais pouvoir le dire au compilateur - pas dans la définition de A que je ne contrôle plus, mais ailleurs, probablement dans la définition de B :
Ecoutez, s'il vous plaît, essayez de penser à
B
comme une superclasse deA
. Ainsi, en particulier, le mettre en mémoire de sorte que si je réinterprète uneA*
en tant queB*
mon code attendB*
fonctionneraient. Et s'il vous plaît, acceptez réellementA*
en tant queB*
(etA&
en tant queB&
etc.).
En C++, nous pouvons le faire dans l'autre sens, c'est-à-dire que si B est la classe que nous ne contrôlons pas, nous pouvons effectuer une opération "sous-classe une classe connue" avec class A : public B { ... }
; et je sais que le C++ n'a pas le mécanisme inverse - "superclasser une classe A connue par une nouvelle classe B". Ma question est la suivante : quelle est l'approximation la plus proche de ce mécanisme ?
Notes :
- Tout ceci est strictement du ressort de la compilation, et non de l'exécution.
- Il peut y avoir pas de des changements de quelque nature que ce soit
class A
. Je ne peux que modifier la définition deB
et le code qui connaît les deuxA
etB
. D'autres personnes continueront à utiliser la classeA
et je le ferai aussi si je veux que mon code interagisse avec le leur. - Cela devrait de préférence être "extensible" à plusieurs superclasses. Alors peut-être que j'ai aussi
class C { protected: int x; double w; public: void baz(); }
qui devrait également se comporter comme une superclasse deA
.