J'ai déjà posté sur ce problème avant (Here), il s'agit d'une approche différente d'une solution. Cette solution semble mieux encapsuler le comportement de ceux qui implémentent la classe, puisqu'elle les empêche d'avoir explicitement besoin de lancer.C++ Utilisation de deux variables de même nom dans les classes dérivées et de base
Voici le problème:
J'ai un projet dans lequel je veux isoler le comportement de base dans la plupart des objets, tout en fournissant un comportement supplémentaire à travers des objets dérivés. Assez simple:
class BaseA
{
virtual void something() {}
}
class DerivedA : public BaseA
{
void something() {}
void somethingElse() {}
}
Maintenant, nous allons dire que j'ai aussi un deuxième ensemble de classes, même schéma d'héritage, sauf qu'ils agrègent les classes ci-dessus. Cependant, j'aimerais que la version de base utilise la classe de base et la version dérivée dans la classe dérivée. Ma solution je pensais à «cacher» la variable de classe de base en utilisant le même nom;
class BaseB
{
BaseA *var;
BaseB()
{
var = new BaseA();
}
virtual void anotherThing1();
virtual void anotherThing2();
virtual void anotherThing3();
}
class DerivedB : public BaseB
{
DerivedA *var;
DerivedB()
{
var = new DerivedA();
}
void anotherThing1();
void anotherThing2();
void anotherThing3();
void andAnother1();
void andAnother2();
}
L'objectif de cette approche est de sorte que les fonctions qui dépendent de la classe ne agrégée dérivée plus besoin de jeter explicitement pour obtenir la fonctionnalité acquise.
void func1(BaseB &b)
{
b.anotherThing1();
b.var->something();
}
void func2(DerivedB &b)
{
b.anotherThing1();
b.andAnother1();
b.var->something();
b.var->somethingElse();
}
void main(int argc, char **argv)
{
BaseB baseB;
DerivedB derivedB;
func1(baseB);
func1(derivedB);
func2(derivedB);
}
Cela serait-il considéré comme une mauvaise pratique?
Pourquoi voulez-vous faire cela? Est-ce qu'un 'Base * var' ne ferait pas pour les deux? Si non, pourquoi voulez-vous qu'ils portent le même nom? Est-ce intentionnellement que cela empêche les autres de lire le code ou quelque chose? –
J'essaie simplement d'obtenir des commentaires sur cette approche. J'ai d'abord pensé à utiliser une seule base * var (le lien au début de mon article). Mais je me demandais si cela serait plus facile pour ceux qui implémentent les classes puisqu'ils n'auraient jamais besoin de lancer explicitement des fonctionnalités dérivées – kbirk