Hériter d'une classe ou d'une classe abstraite
Si vous avez plusieurs classes où vous voulez qu'ils héritent d'une classe de base pour les fonctionnalités communes, devriez-vous mettre en œuvre la classe de base à l'aide d'une classe ou d'une classe abstraite?
Vous devez vous connecter pour publier un commentaire.
Cela dépend, si vous souhaitez ne jamais être en mesure d'instancier la classe de base, puis le rendre abstrait. Sinon, laissez comme une classe normale.
Si la classe de base ne devrait pas être instanciée, puis en faire une classe abstraite - si la classe de base doit être instancié alors ne pas en faire abstraction.
Dans cet exemple, il est logique de faire de la classe de base abstraite comme la classe de base n'a pas de sens concret:
Cependant, dans l'exemple suivant, vous pouvez voir comment la classe de base n'ont un sens concret:
C'est très subjectif vraiment, vous devriez être en mesure de faire un assez bon jugement d'appel, sur la base des besoins de votre domaine particulier.
Il dépend, est-il judicieux pour la classe de base en question existe sur c'est propre sans être dérivée à partir de? Si la réponse est oui, alors il devrait être une classe ordinaire, autrement, il devrait être d'une classe abstraite.
Je suggère:
La raison, je préfère le réel classes au lieu de classes abstraites, c'est que les classes abstraites ne peut pas être instanciée, ce qui limite les options pour l'avenir inutilement. Par exemple, plus tard, j'ai peut-être besoin de l'état et des méthodes de la classe de base, mais ne peut pas hériter et n'ont pas besoin d'implémenter l'interface; si la classe de base abstraite, je suis hors de la chance, mais si la classe de base est une classe ordinaire alors je peux créer une instance de la classe de base et tenez-le comme une composante de mon autre classe, et délégué à l'exemple de réutilisation de l'état/méthodes prévues.
Oui cela n'arrive pas souvent, mais le point est: faire de la classe de base abstraite empêche ce genre de réutilisation/solution quand il n'y a aucune raison de le faire.
Maintenant, si l'instanciation de la classe de base serait en quelque sorte dangereux, puis de la rendre abstraite - ou, de préférence, de le rendre moins dangereux, si possible 😉
Pensez-y comme un compte en banque:
Vous pouvez faire un générique de base abstraite compte appelé "compte", c'est des informations de base telles que les coordonnées du client.
Vous pouvez ensuite créer deux classes dérivées appelé "SavingAccount" ou "DebitAccount" qui peuvent avoir leur propre comportement spécifique tout en bénéficiant de la classe de base de comportement.
C'est une situation où le client doit avoir un Compte d'Épargne ou un Compte de Débit, un générique de "Compte" n'est pas permis car il n'est pas très populaire dans le monde réel afin d'avoir juste un compte d'aucune description.
Si vous pouvez créer un scénario similaire à vos besoins, abstrait est le chemin à parcourir.
Les classes abstraites sont partiellement mises en œuvre classes.
Par lui-même n'a pas de sens d'avoir une instance d'une classe abstraite, elle doit être dérivée. Si vous souhaitez être en mesure de créer de la classe de base, il ne peut pas être abstraite.
J'aime à penser que les classes abstraites interfaces qui ont certains membres de la pré-définis, car ils sont communs à tous les sous-classes.
Penser à une autre façon
Si la réponse est non, alors le rendre abstrait. Si c'est oui, alors il est probable que vous voulez en faire un béton de classe.
Je dirais que si vous envisagez de ne pas l'appeler la classe de base par lui-même, alors vous devez le définir comme une classe abstraite.
La dépend si vous voulez que la classe de base pour être mises en œuvre sur son propre ou pas.
Comme une classe abstraite, vous ne pouvez pas créer des objets à partir d'elle.
Les classes abstraites sont grands pour les prédéfinis fonctionnalités, par exemple - sais quand le minimum exacte le comportement d'une classe doit exposer, mais pas de quelles données il doit utiliser et, ou, l'exacte mise en œuvre.
Normal (non abrégé) classes peut être grande pour des choses similaires mais vous devez savoir que la mise en œuvre de détails pour être en mesure de les écrire.
Aussi, vous pouvez utiliser les interfaces (individuellement ou sur des classes, que ce soit abstrait ou pas) pour définir le genre même de la définition du prototype.
Encore une autre option pourrait être l'utilisation de génériques
Toutes ces méthodes peuvent être utilisées pour définir un certain prototype pour les classes de travailler avec. Manières de s'assurer qu'Un code peut parler de code B. Et bien sûr, vous pouvez mélanger et assortir tous les ci-dessus à votre convenance. Il n'existe pas de bonne façon mais j'aime bien la définition d'interfaces et les classes abstraites, puis se référant aux interfaces. De cette façon, élimine certaines de la pensée exigences de "plomberie" dans les classes de niveau supérieur, tout en conservant le maximum de flexibilité. (le fait d'avoir des interfaces enlève l'exigence de l'utilisation de la classe de base abstraite, mais qui la laisse comme une option).
Je pense que beaucoup d'entre vous doivent le repasser de base OO classes de nouveau.
Le principe de base sous-jacentes dans OOA/OOD est à l'abstrait abstrait abstrait, jusqu'à ce que vous ne pouvez pas vous soustraire sans plus. Si ce que vous cherchez à est une abstraction qu'il en soit, c'est ce que votre OOA/OOD déjà dit. Toutefois, si vous assis là, vous vous demandez si "code" doit être abstraite ou non, alors de toute évidence vous ne savez pas ce que le terme signifie et doit aller apprendre les rudiments de OOA/OOD/POO encore une fois 🙂
Plus au point, vous devriez apprendre des Modèles de Conception Harmonique et Théorie, cela aidera à votre OO dessins énormément!