Pourquoi avons-nous besoin de classes abstraites en C ++?
Je viens d'apprendre sur le polymorphisme dans ma programmation orientée objet Classe et je vais avoir un moment difficile de comprendre comment les classes de base abstraites sont utiles.
Quel est le but d'une classe abstraite? Quelle est la définition d'une classe de base abstraite fournir qui n'est pas prévue par la création de chaque fonction nécessaire dans chaque classe?
source d'informationauteur Yoshua Joo Bin
Vous devez vous connecter pour publier un commentaire.
Le but d'une classe abstraite est de définir un protocole commun pour un ensemble de sous-classes concrètes. Ceci est utile lors de la définition des objets que le partage de code, les idées abstraites, etc.
Les classes abstraites avez pas de cas. Une classe abstraite doit avoir au moins un différé de la méthode (ou fonction). Pour accomplir cela en C++, une fonction membre virtuelle pure est déclarée mais non défini dans la classe abstraite:
Tente d'instancier une classe abstraite entraînera toujours une erreur du compilateur.
L'idée principale ici est la réutilisation du code et bon de partitionnement de toutes les classes. Il est plus logique de définir une fonction une fois dans une classe parent, plutôt que de les définir, à maintes reprises et en plusieurs sous-classes:
Avoir une classe abstraite comme "Chien", avec une méthode virtuelle comme "l'écorce" permet à toutes les classes qui héritent de Chien afin de leur écorce code appelé de la même manière, même si le Beagle de l'écorce est mis en œuvre de façon de façon différente que le Collie.
Sans abstraite commune des parents (ou au moins d'un parent commun avec l'écorce de méthode virtuelle), il serait difficile de faire ce qui suit:
Ont un Vecteur de type Chien qui contient les Colleys, les Beagles, les Bergers allemands, etc et de faire de chacun d'eux écorce. Avec un Vecteur de Chiens qui contient les Colleys, les Beagles, les Bergers allemands tout ce que vous avez à faire pour leur donner toute l'écorce est d'itérer dans une boucle for et un appel de l'écorce sur chacun d'eux. Sinon, vous devez avoir un Vecteur distinct de Colley, le Vecteur de Beagles etc.
Si la question est "pourquoi faire Chien abstrait quand il peut être en béton, la quasi écorce défini avec une valeur par défaut de mise en œuvre qui peut être remplacé?", la réponse serait que cela peut être acceptable, parfois-mais, à partir d'une conception de point de vue, il n'y a vraiment aucune une telle chose comme un Chien qui n'est pas un Colley ou un Beagle ou une autre race ou de mélange de sorte que s'ils sont tous les Chiens, il n'en est pas un en réalité, c'est un Chien, mais non d'une autre classe dérivée de trop. Aussi, puisque les chiens aboient est tellement varié d'une race à l'autre, il est rare d'avoir de réelle acceptable par défaut de mise en œuvre de l'écorce qui serait acceptable pour tout bon groupe de Chiens.
J'espère que cela vous aide à comprendre le but: oui, vous allez avoir à mettre en œuvre l'écorce de chaque sous-classe de toute façon, mais le résumé ancêtre permet de traiter toute la sous-classe en tant que membre d'une classe de base et d'appeler les comportements qui peuvent être similaires sur le plan conceptuel comme de l'écorce, mais en fait très différentes implémentations.
Les classes abstraites permettent pour le moment de la compilation du protocole d'application. Ces protocoles définissent ce que signifie faire partie d'une famille de la classe.
Une autre façon de penser, il est une classe abstraite est un contrat que votre mise en œuvre de classes doivent remplir. Si ils ne répondent pas à ce contrat, ils ne peuvent pas faire partie de la catégorie famille et qu'ils doivent être modifiés pour être conforme au contrat. Les contrats peuvent fournir des fonctionnalités par défaut, mais il laisse aussi à la sous-classe pour définir de façon plus spécifique ou une fonctionnalité différente tout en restant dans le champ d'application du contrat.
Pour les petits projets, cela peut ne pas sembler utile, mais pour les grands projets, il fournit de la conformité et de la structure qu'il fournit de la documentation par le biais de la classe abstraite contrat. Cela rend plus facile à gérer le code et le fait pour les sous-classes ont chacun le même protocole de décisions à l'aide et le développement de nouvelles sous-classes plus faciles.
Le but d'une classe abstraite doit servir de classe de base à partir de laquelle d'autres classes peuvent hériter. Les classes abstraites ne peuvent pas être utilisées pour instancier des objets et ne sert que d'une interface. D'une tentative d'instancier un objet d'une classe abstraite provoque une erreur de compilation. (parce que vtable entrée n'est pas rempli avec de l'emplacement de mémoire pour fonction virtuelle nous l'avons mentionné dans la Classe Abstraite)
Ainsi, si une sous-classe de l'ABC doit être instancié, il doit mettre en œuvre chacune des fonctions virtuelles, ce qui signifie qu'il prend en charge l'interface déclarée par l'ABC. L'échec de remplacer une fonction virtuelle pure dans une classe dérivée, puis de tenter d'instancier des objets de cette classe, est une erreur de compilation.
Exemple:
ici, dans cet exemple, vous pouvez comprendre.
J'ai un chien. Classe abstraite chien avec une méthode d'écorce. Mon chien fait une écorce. D'autres chiens aboient de façon différente. Donc, la définition d'un chien dans l'abstraction est utile.
Les classes abstraites sont utilisés pour définir une interface pour être mis en œuvre. Voir quelques références:
http://en.wikibooks.org/wiki/C%2B%2B_Programming/Classes/Abstract_Classes
Une classe abstraite
AbstractClass
comme une classe de base est nécessaire lorsqu'il y a une fonctionnalité qui est désiré pour tous les objets qui ont un type résultant deAbstractClass
mais ne peut raisonnablement être mis en œuvre sur leAbstractClass
lui-même.L'ancien et quelque peu artificielle OO exemple d'avoir une classe de base
Vehicle
avec les classes dérivéesCar
Motorcycle
... fournit un bon exemple ici, dites que vous voulez une méthodemove()
- vous pouvez mettre en œuvre la façon dont unCar
ou unMotorcycle
se déplace, maisVehicle
s ne se déplacent pas de façon générique, de sorteVehicle::move()
devra être virtuelle pure etVehicle
donc abstraite.Vous devez créer chaque fonction nécessaire marqué comme
abstract
dans chaque classe dérivée.Si vous question est, pourquoi créer fonction abstraite dans la classe abstraite?
Il permet stricte moment de l'exécution du polymorphisme.
Également lire Interface vs Classe Abstraite (général OO)
nous pouvons voir que dogbarking est une fonction écrite dans un autre module. il ne connaît que la classe abstraite chien. même si il peut faire appel à la fonction de l'écorce de l'intérieur ourclass. dans la fonction principale nous créer un objet de ourclass et passer à la fonction dogbarking où il a reçu l'aide de l'objet de référence de la classe abstraite chien.
Imaginez que vous avez deux méthodes pour afficher une chaîne de caractères:
Et vous souhaitez écrire du code qui peut être commuté entre ces deux méthodes:
Ce code est étroitement couplée à des méthodes spécifiques utilisées pour l'affichage de la chaîne. Ajout d'une méthode supplémentaire, changement de la façon dont la méthode est choisie, etc. aura une incidence sur chaque morceau de code qui utilise cette. Ce code est étroitement couplé à l'ensemble des méthodes que nous utilisons pour afficher des chaînes de caractères.
Classes de base abstraites sont un moyen de découplage code qui utilise certaines fonctionnalités à partir du code qui implémente cette fonctionnalité. Il le fait par la définition d'une interface commune à toutes les différentes façons de faire la tâche.
À l'aide de l'interface définie par AbstractStringDisplayer nous pouvons créer et d'utiliser autant de nouvelles façons d'afficher les chaînes de caractères comme nous le voulons, et le code qui utilise l'interface abstraite n'aurez pas besoin d'être changé.