Question

Je me demande s'il existe des différences entre les classes dérivées lors de l'utilisation de classes abstraites et réelles pour l'héritage?

Il me semble que l'héritage de classe réelle crée une hiérarchie, tandis que l'héritage de classe abstraite n'est qu'un code copier-coller destiné au compilateur pour les classes dérivées.

La classe abstraite crée-t-elle une hiérarchie? Peut-on y accéder avec un mot clé spécial?

Je sais que vous utilisez le mot-clé base pour accéder à la classe de base, mais les membres abstraits ressemblent-ils aux membres d'origine dans les classes dérivées?

Enfin, quelle est la différence de performance entre le 2?

Était-ce utile?

La solution

Oui, la classe abstraite existe - le compilateur ne fait pas de copier-coller. Vous ne constaterez aucune différence de performances car le CLR doit toujours effectuer des appels de méthodes virtuelles.

Par exemple, le C # suivant:

abstract class Foo { }

class Bar : Foo { }

génère l'IL suivant:

.class private abstract auto ansi beforefieldinit Foo
    extends [mscorlib]System.Object { }

.class private auto ansi beforefieldinit Bar
    extends Foo { }

Le concept de type abstrait fait vraiment partie de l'IL.

Autres conseils

La seule différence est qu’une classe de base abstraite ne peut pas être instanciée sans en être dérivée, alors qu’une classe non abstraite le peut. Du point de vue d’une classe dérivée, tout est pareil.

Les classes abstraites et les classes concrètes sont des outils de modélisation (OO). Il n'y a pas de différence en ce qui concerne les règles d'héritage et de substitution. Il y a quelques détails techniques:

  • Une classe abstraite ne peut pas être instancié
  • Les méthodes abstraites sont autorisé uniquement dans les classes abstraites

Mais une classe abstraite peut avoir des méthodes, propriétés et champs non abstraits.

Les performances ne sont pas liées aux classes, mais les méthodes abstraites / virtuelles sont légèrement pénalisées.

Le pouvoir de la classe abstraite réside dans sa non-implémentation. Il peut être utilisé pour s'assurer que l'instance de classes dérivées aura toutes les fonctionnalités nécessaires

La classe abstraite est une forme primitive d'une classe de base. Celles-ci ne peuvent pas être instanciées, ce qui signifie que le développeur doit dériver de ces classes pour utiliser leurs fonctionnalités. Toute méthode abstraite définie dans la classe abstraite doit être implémentée dans sa classe enfant. Donc, on peut implémenter des méthodes qui doivent être présentes dans la classe enfant qui dérive de la classe abstraite. Vous définissez donc les éléments de base d’un objet que le développeur peut personnaliser à sa guise.

Il est préférable d’utiliser les classes non abstraites pour étendre la fonctionnalité d’une classe tout en continuant d’utiliser ce qui se trouve dans la classe non abstraite. Tous les membres et méthodes non privés sont accessibles à la classe dérivée.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top