Je suis en train de concevoir une interface pour mon projet et curieux de savoir si l'idée peut devenir réalité ou non. Voici la situation, Lors de l'exécution, je souhaite utiliser un tableau de pointeurs de classe de base pour émettre des commandes à différents objets dérivés. Différents objets dérivés ont une implémentation différente (fonctions virtuelles). Mon problème est le suivant: si ces objets ont différents niveaux de support de l'interface, comment puis-je éviter d'écrire une fonction vide?Design Pattern: interface uniforme pour les classes dérivées partiellement supportées
Par exemple, (mon code actuel)
Class Base { //this is the main interface
public:
virtual void basicFun() = 0;
virtual void funA(int input1) {return;}
virtual void funB(int input2) {return;}
virtual void funC(int input3) {return;}
}
Class Derived1 : public Base { //this class support only funA()
public:
void basicFun() {//....}
void funA(int input1) {//do something}
}
Class Derived2 : public Base { //this class support both funA() funB()
public:
void basicFun() {//....}
void funA(int input1) {//do something}
void funB(int input2) {//do something}
}
Class Derived3 : public Base { //this class support all
public:
void basicFun() {//....}
void funA(int input1) {//do something}
void funB(int input2) {//do something}
void funC(int input3) {//do something}
}
Hypothèse: pour un certain objet, la fonction non prise en charge ne serait jamais appelé. c'est-à-dire BasePtr-> funC() ne sera jamais appelé si l'objet pointé par basePtr est Derived1 ou Derived2. Le problème est:
- je dois définir une fonction vide soit dans la base ou dérivée si une interface uniforme est souhaitée
- Si les fonctions vides sont définis comme ci-dessus, le compilateur ne cesse de me avertir paramètres non référencés (INPUT1 ~ ENTRÉE3) . Bien sûr, je peux l'éteindre, mais je n'aime pas ça.
Alors, existe-t-il un modèle que je peux utiliser pour obtenir une interface uniforme sans définir de fonctions vides? J'y ai réfléchi pendant quelques jours. Cela semble impossible. Parce que funA() funB() et funC() doivent être dans l'interface pour que je puisse utiliser un tableau de pointeurs de base pour contrôler tous les objets, ce qui signifie que Derived1, funB() et funC() doivent être définis.
Merci, et merci beaucoup, et merci de partager vos idées.
Solti
Salut, merci de répondre. Je peux comprendre ce que vous voulez dire par une voiture sans frein(). Cependant, si nous développons une sorte de logiciel OEM, nous pourrions utiliser le même code de niveau de bibliothèque mais un code de niveau AP différent. Donc j'espère garder l'interface inchangée et seulement modifier du code dans AP. Donc, pour certains clients, je veux leur donner une voiture sans frein(). et il est garanti voiture-> Frein() n'est jamais nécessaire. (Peut-être que le client fait des crash tests) Deuxièmement, j'ai essayé le nom du paramètre omettant le truc, et ça marche !!! Merci beaucoup! – Solti