85 votes

Quand utiliser les classes abstraites ?

Voici l'article de MSDN sur classes abstraites mais je ne comprends vraiment pas...

Quand dois-je vraiment utiliser les classes abstraites ? Quels sont les avantages de l'utilisation des classes abstraites ?

0 votes

L'article de MSDN sur les classes abstraites est sérieusement une blague, c'est triste.

156voto

richard Points 939

Les classes abstraites sont utiles lorsque vous avez besoin d'une classe à des fins d'héritage et de polymorphisme, mais qu'il est inutile d'instancier la classe elle-même, mais seulement ses sous-classes. Elles sont couramment utilisées lorsque vous voulez définir un modèle pour un groupe de sous-classes qui partagent un code d'implémentation commun, mais vous voulez également garantir que les objets de la super-classe ne peuvent pas être créés.

Par exemple, disons que vous devez créer des objets Chien, Chat, Hamster et Poisson. Ils possèdent des propriétés similaires, comme la couleur, la taille, le nombre de pattes et le comportement, et vous créez donc une superclasse Animal. Cependant, de quelle couleur est un Animal ? Combien de pattes possède un objet Animal ? Dans ce cas, cela n'a pas beaucoup de sens d'instancier un objet de type Animal mais plutôt seulement ses sous-classes.

Les classes abstraites présentent également l'avantage du polymorphisme, qui vous permet d'utiliser le type de la superclasse (abstraite) comme argument de méthode ou comme type de retour. Par exemple, si vous avez une classe PetOwner avec une méthode train(), vous pouvez la définir comme prenant un objet de type Animal, par exemple train(Animal a), plutôt que de créer une méthode pour chaque sous-type d'Animal.

15 votes

L'animal définirait le besoin de propriétés de couleur, de nombre de pattes et de taille. Ainsi, lorsque j'aborde le chat en tant qu'animal, j'attends avec ferveur que l'animal ait une couleur, un nombre de pattes et une taille. Je pense également qu'il est tout à fait légitime d'implémenter ces propriétés dans la classe de base, car le contraire conduirait à une duplication du code. Les descriptions ici se perdent un peu dans les propriétés plutôt que dans les méthodes, il n'y aurait aucun intérêt à ce que Animal implémente une méthode 'Move' car chaque animal peut avoir une méthode de locomotion différente mais cela définirait le besoin d'une méthode 'Move'.

0 votes

La réponse suivante m'a également aidé à comprendre ce qu'est une classe abstraite stackoverflow.com/a/2558588/2188550

0 votes

Nous ne devrions pas utiliser la super classe comme type de retour car elle est moins spécifique et c'est une mauvaise pratique. Le type de retour doit être plus spécifique. Si Cat est le type de retour, alors Animal ne devrait pas être utilisé comme type de retour.

6voto

Vivek Saurabh Points 51

En utilisant des classes abstraites, nous sommes en mesure de rendre la classe plus générique.

Par exemple, si la classe A est une classe abstraite et que des classes B, C et D étendent la classe abstraite A, ces sous-classes hériteront d'une méthode déjà déclarée dans la classe abstraite A, rendant ainsi la méthode plus générique.

5voto

Puppy Points 90818

Vous les utilisez pour les classes qui ne seront jamais créées (donc qui n'existent pas), mais vous voulez en hériter pour des raisons de polymorphisme.

3voto

Martin Milan Points 3284

Utilisez les classes abstraites lorsque vous définissez le comportement d'une classe dans votre hiérarchie de classes qui ne sera jamais utilisée pour instancier directement un objet.

Alors, pense à toi comme à Dieu pour un moment. Vos classes CBabyBoy et CBanyGirl ne seraient pas abstraites, car ce sont des objets solides qui sont créés. D'un autre côté, vos classes CPerson et CAnimal seraient abstraites - elles sont utiles du point de vue de la hiérarchie des types, mais vous n'exécuterez jamais CAnimal dingbat = new Animal();

2voto

n535 Points 2558

Fondamentalement, vous devez utiliser une classe abstraite lorsqu'une entité de votre hiérarchie possède logiquement une ou plusieurs méthodes qu'elle ne sait pas implémenter, mais que ses descendants le font. Il y a des milliards d'exemples de la "vraie vie" sur le web, vraiment).

3 votes

Plutôt que "ne sait pas", il faudrait plutôt dire "ne peut pas ou ne devrait pas". Même dans l'exemple de base de l'objet Shape, la méthode draw pourrait être implémentée comme une méthode vide, mais devrait-elle l'être ?

0 votes

Point de vue intéressant) Mais je veux dire, que l'implémentation vide ne compte pas bien sûr=)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X