Prenez la hiérarchie de classe C++ simplifiée suivante à titre d'exemple. Ce que je veux accomplir est que Service
fournit une méthode virtuelle pour enregistrer des objets arbitraires Model
. Mais chaque sous-classe de Service
, par ex. BoxService
devrait et ne peut enregistrer que Box
objets.Paramètres de covariance C++ - Motif de conception
En raison du fait que C++ ne supporte pas covariance dans les paramètres de la méthode, je ne peux pas simplement déclarer la méthode de sauvegarde dans BoxService.h
comme:
void save(Box box);
Ma question est, est-il modèle de conception préféré ou les meilleures pratiques pour ce problème? Ou devrais-je vérifier dans l'implémentation de la fonction de sauvegarde dans BoxService.cpp
si l'objet Model arrivant est de type Box et lancer une exception sinon?
Model.h
class Model {
private:
int id;
};
Box.h
class Box : public Model {
private:
int size;
};
Service.h
class Service {
public:
virtual void save(Model model);
};
BoxSe rvice.h
class BoxService : public Service {
public:
void save(Model box);
};
BoxService.cpp
void BoxService::save(Model box) {
// TODO: save box and make sure that box is of type 'Box' and not any other subtype of 'Model'
}
Ceci casse le polymorphisme. Si on me donne un 'Service' et que j'appelle' save (model) ', cela ne devrait pas échouer si on me donne un' BoxService'. Les paramètres contravariants vont dans l'autre sens. Si 'Service' peut enregistrer une' Box', alors 'BoxService' pourrait prendre Model comme paramètre, puisque les appelants' Service' passeront 'Box's, qui sont' Model', mais les appelants directement 'BoxService 'pourrait passer n'importe quel type' Model'. C'est ce que C++ ne supporte pas. – chris
Pourquoi 'BoxService' hérite' Service'? Un sac de pommes n'est pas un sac de fruits. – aschepler
Je suis d'accord! Est-il même possible d'agencer un dessin similaire à celui décrit ci-dessus sans casser le polymorphisme? –