L'affacturage et l'héritage en C ++

Le concept d'héritage, et donc l'affacturage, en C ++ permet une classe d'hériter des propriétés d'une classe de base. Héritage a un certain nombre de purposes- le principal avantage de l'héritage est la capacité de souligner la relation entre les classes. Ceci est la soi-disant Is_a relation - un Fourneau is_a Four et des trucs comme ça.

L'affacturage est great stuff si vous faites les corrélations correctes. Par exemple, le micro-ondes par rapport relation four conventionnel semble naturel. Prétendre que micro-ondes est un type spécial de grille-pain, et vous êtes dirigé des ennuis. Certes, ils ont tous deux faire les choses à chaud, ils utilisent l'électricité, et ils sont tous les deux trouvé dans la cuisine, mais la similitude se termine là - un micro-ondes ne peut pas faire des toasts et un grille-pain ne peut pas faire des nachos.

L'identification des catégories inhérents à un problème et tirer les relations correctes entre ces classes est un procédé connu en tant que affacturage. (Le mot est lié à l'arithmétique que vous avez été obligé de le faire à l'école primaire: l'affacturage sur les dénominateurs communs des moindres, par exemple, 12 est égal à 2 fois 2 fois 3.)

Voici comment vous pouvez utiliser l'héritage pour simplifier vos programmes à l'aide d'un exemple de compte bancaire. Supposons que vous avez été invité à écrire un programme simple qui bancaire mis en œuvre le concept d'un compte d'épargne et un compte-chèques.

Programmeurs orientés objet ont mis au point une façon concise de décrire les points saillants d'une classe dans un dessin. La Vérification et Épargne les classes sont représentées sur cette figure. (Ceci est seulement un des nombreux moyens d'exprimer graphiquement la même chose.)

classes indépendants & lt; i>Checkinglt; / i> et lt; i> Savings.lt; / i>
Classes indépendantes Vérification et Épargne.

Pour lire cette figure et les autres figures, rappeler ce qui suit:

  • La grande boîte est la classe, avec le nom de classe au sommet.

  • Les noms dans les boîtes sont des fonctions membres.

  • Les noms ne sont pas dans des boîtes sont membres de données.

  • Les noms qui se prolongent à mi-chemin sur les cases sont publiquement accessibles membres- qui est, ces membres peuvent être consultés par les fonctions qui ne sont pas partie de la classe ou de l'un de ses descendants. Les membres qui sont complètement à l'intérieur de la boîte ne sont pas accessibles de l'extérieur de la classe.




  • Une flèche épaisse représente la Is_a relation.

  • Une flèche mince représente la A UN relation.

UN Car is_a véhicule, mais un Car HAS_A Motor.

Vous pouvez le voir dans le premier chiffre que le Vérification et Épargne classes ont beaucoup en commun. Par exemple, les classes ont un retrait () et dépôt () fonction de membre. Parce que les deux classes ne sont pas identiques, mais ils doivent rester sous forme de classes distinctes. (Dans une application bancaire de la vie réelle, les deux classes seraient une bonne affaire plus différent que dans cet exemple.) Pourtant, il devrait y avoir un moyen d'éviter cette répétition.

Vous pourriez avoir une de ces classes héritent de l'autre. Épargne a plus de membres que Vérification, de sorte que vous pourriez laisser Épargne hériter de Vérification. Cette disposition est représentée dans cette figure suivante.

La Épargne classe hérite de tous les membres. La classe est complété par l'ajout de l'élément de données noWithdrawals et en redéfinissant la fonction retrait (). Vous devez surcharger retrait () parce que les règles pour retirer de l'argent d'un compte d'épargne sont différents de ceux pour retirer de l'argent à partir d'un compte-chèques.

& lt; i>Savingslt; / i> implémenté comme une sous-classe de lt; i> Checking.lt; / i>
Épargne mis en œuvre en tant que sous-classe de Vérification.

Bien que laissant Épargne hériter de Vérification est laborsaving, il est pas complètement satisfaisant. Le principal problème est que, comme le poids figurant sur mon permis de conduire, il dénature la vérité. Cette relation d'héritage implique qu'un compte d'épargne est un type spécial de compte courant, dont il est pas.

Ces fausses déclarations sont source de confusion pour le programmeur, à la fois aujourd'hui et de demain. Un jour, un programmeur familier avec nos astuces de programmation aura à lire et à comprendre ce qui fait notre code. Représentations trompeuses sont difficiles à concilier et à comprendre.

En outre, ces déclarations inexactes peuvent conduire à des problèmes sur la route. Supposons, par exemple, que la banque change ses politiques à l'égard de la vérification des comptes. Dites-le décide de facturer des frais de service sur la vérification des comptes que si le solde minimum plonge sous une valeur donnée pendant le mois.

Un tel changement peut être facilement manipulé avec des changements minimes à la classe Vérification. Vous aurez à ajouter un nouveau membre de données à la classe Vérification de garder une trace de la solde minimum au cours du mois. Allons sur une branche et appellent minimumBalance.

Mais maintenant, vous avez un problème. Car Épargne hérite de Vérification, épargne obtient ce nouveau membre de données ainsi. Il n'a pas besoin de ce membre parce que le solde minimum ne modifie pas les comptes d'épargne, de sorte qu'il se trouve juste là. Rappelez-vous que chaque objet de compte-chèques a cette supplémentaires minimumBalance membre. Un membre supplémentaire des données ne peut pas être un gros problème, mais il ajoute encore plus de confusion.

De tels changements accumuler. Aujourd'hui, il est un membre de données extra - demain, il est une fonction membre changé. Finalement, le compte d'épargne classe transporte beaucoup de bagages supplémentaire qui est applicable seulement à la vérification des comptes.

Maintenant, la banque revient et décide de changer quelques économies représentent politique. Cela vous oblige à modifier une fonction en Vérification. De tels changements dans la classe de base se propagent automatiquement à la sous-classe, sauf si la fonction est déjà remplacée dans la sous-classe Épargne.

Par exemple, supposons que la banque décide de donner grille-pain pour chaque dépôt dans le compte courant. Sans la banque (ou ses programmeurs) le savoir, les dépôts à la vérification des comptes en résulterait automatiquement en dons de grille-pain. Sauf si vous êtes très prudent, les modifications apportées Vérification peut apparaître de manière inattendue dans Épargne.

Comment pouvez-vous éviter ces problèmes? Affirmant que Vérification est un cas particulier de Épargne changements, mais ne résout pas notre problème. Qu'est-ce que vous avez besoin est une troisième classe (appeler Compte, juste pour des grimaces) qui incarne les choses qui sont communes entre Vérification et L'épargne, comme indiqué ici.

Basing & lt; i>Checkinglt; / i> et lt; i> Savingslt; / i> sur une commune lt; i> Accountlt;. / i> class
Basing Vérification et Épargne sur une commune Considération classe.

Comment ne la construction d'un nouveau compte résoudre les problèmes? Tout d'abord, la création d'une nouvelle Considération classe est une description plus précise du monde réel (quelle qu'elle soit). Bien sûr, il ya vraiment quelque chose de connu comme un compte. Les comptes d'épargne et comptes courants sont des cas particuliers de ce concept plus fondamental.

De plus, la classe Épargne est isolé à partir de modifications de la classe Vérification (et vice versa). Si les instituts bancaires d'un changement fondamental de tous les comptes, vous pouvez modifier Compte, et tous les sous-classes hériteront automatiquement le changement. Mais si la banque modifie sa politique seulement pour la vérification des comptes, vous pouvez modifier seulement le Vérification classe de compte sans affecter Épargne.

Ce processus d'abattage des propriétés communes de classes similaires est l'essence de l'affacturage de classe.

L'affacturage est légitime que si la relation d'héritage correspond à la réalité. Affacturage ensemble une classe Souris et Joystick parce qu'ils sont à la fois le matériel périphériques de pointage est légitime. Affacturage ensemble une classe Souris et Affichage parce qu'ils font tous deux appels du système d'exploitation de bas niveau est pas.


» » » » L'affacturage et l'héritage en C ++