Tout le monde confond facilement les deux, et je suis pareil. En écoutant les modèles de conception du professeur Li Jianzhong, il fait toujours référence aux classes abstraites comme à des interfaces, ce qui me rend encore plus confus, alors j'ai cherché des informations sur Internet. Informations.
1. Classe abstraite :
La classe abstraite est une classe spéciale, mais elle ne peut pas être instanciée, elle a d'autres caractéristiques de la classe, l'important est que la classe abstraite puisse inclure des méthodes abstraites ; qui sont des classes ordinaires Ce qui ne peut pas être fait. Les méthodes abstraites ne peuvent être déclarées que dans des classes abstraites et ne contiennent aucune implémentation. Les classes dérivées doivent les remplacer. De plus, une classe abstraite peut être dérivée d'une classe abstraite et peut ou non remplacer les méthodes abstraites de la classe de base. Dans le cas contraire, sa classe dérivée doit les remplacer.
2. Interface :
L'interface est un type de référence, similaire à une classe, et présente trois similitudes avec les classes abstraites :
1. Elle ne peut pas être instanciée
2. Contient une méthode non implémentée ; déclaration;
3. Les classes dérivées doivent implémenter des méthodes non implémentées. Les classes abstraites sont des méthodes abstraites, et les interfaces sont toutes des membres (non seulement des méthodes mais d'autres membres
De plus, les interfaces ont les caractéristiques suivantes) ; 🎜>En plus des méthodes, les interfaces peuvent également contenir des propriétés, des indexeurs et des événements, et ces membres sont tous définis comme publics. De plus, il ne peut contenir aucun autre membre, tel que des constantes, des champs, des constructeurs, des destructeurs et des membres statiques. Une classe peut hériter directement de plusieurs interfaces, mais ne peut hériter directement que d'une seule classe (y compris les classes abstraites).
3. La différence entre les classes abstraites et les interfaces :
1. Les classes sont des abstractions d'objets. Les classes abstraites peuvent être comprises comme traitant les classes comme des objets. Les classes abstraites sont appelées classes abstraites. spécification ou régulation du comportement. L'interface personnalisée de Microsoft est toujours suivie d'un champ capable, prouvant qu'elle exprime une classe "Je peux le faire...". Les classes abstraites sont plus définies entre une série de classes étroitement liées, et les interfaces le sont. principalement des classes qui sont vaguement liées mais qui implémentent toutes une certaine fonction.
2. L'interface n'a fondamentalement aucune caractéristique spécifique d'héritage, elle promet seulement des méthodes qui peuvent être appelées
3. Une classe Plusieurs interfaces peuvent être implémentées ; à la fois, mais une seule classe parent peut être étendue
4. Les interfaces peuvent être utilisées pour prendre en charge les rappels, mais l'héritage n'a pas cette fonctionnalité
5. Les classes abstraites ne peuvent pas être scellées.
6. Les méthodes spécifiques implémentées par les classes abstraites sont virtuelles par défaut, mais les méthodes d'interface de la classe qui implémente l'interface sont non virtuelles par défaut, vous pouvez bien sûr également les déclarer comme virtuelles. . (Interface) et Semblable aux classes non abstraites, une classe abstraite doit également fournir ses propres implémentations pour tous les membres des interfaces répertoriées dans la liste des classes de base de la classe. Cependant, les classes abstraites sont autorisées à mapper les méthodes d'interface aux méthodes abstraites.
8. Les classes abstraites implémentent un principe en oop, séparant le mutable et l'immuable. Les classes et interfaces abstraites sont définies comme immuables et des sous-classes de siège mutables sont implémentées.
9. Une bonne définition d'interface doit avoir des fonctionnalités spécifiques plutôt que multifonctions, sinon cela entraînera une pollution de l'interface. Si une classe n’implémente qu’une seule fonction de cette interface et doit implémenter d’autres méthodes dans l’interface, on parle de pollution d’interface.
10. Essayez d'éviter d'utiliser l'héritage pour implémenter les fonctions des composants, mais utilisez la réutilisation de la boîte noire, c'est-à-dire la combinaison d'objets. Parce que les niveaux d'héritage augmentent, la conséquence la plus directe est que lorsque vous appelez une certaine classe dans ce groupe de classes, vous devez toutes les charger dans la pile ! Les conséquences peuvent être imaginées. (Compris en conjonction avec le principe de pile). Dans le même temps, les amis intéressés peuvent remarquer que lorsque Microsoft crée une classe, il utilise souvent la méthode de combinaison d'objets. Par exemple, dans asp.net, la classe Page possède des attributs tels que Server Request, mais en fait, ce sont tous des objets d'une certaine classe. Utiliser cet objet de la classe Page pour appeler des méthodes et propriétés d’autres classes est un principe de conception très basique.
11. Si une classe abstraite implémente une interface, vous pouvez mapper les méthodes de l'interface à la classe abstraite en tant que méthodes abstraites sans avoir à les implémenter, et implémenter les méthodes de l'interface dans la sous-classe de la classe abstraite <.>
4. Utilisation de classes et d'interfaces abstraites :
1. Si vous prévoyez de créer plusieurs versions d'un composant, créez une classe abstraite. Les classes abstraites fournissent des méthodes simples pour contrôler les versions des composants.
2. Si la fonctionnalité créée doit être utilisée sur un large éventail d'objets disparates, utilisez des interfaces. Si vous souhaitez concevoir des blocs fonctionnels petits et concis, utilisez des interfaces.
3. Si vous souhaitez concevoir une grande unité fonctionnelle, utilisez des classes abstraites. Si vous souhaitez fournir des fonctionnalités implémentées communes à toutes les implémentations du composant, utilisez des classes abstraites.
4. Les classes abstraites sont principalement utilisées pour des objets étroitement liés ; les interfaces conviennent pour fournir des fonctions communes à des classes non liées.
Voici quelques métaphores que j'ai vues en ligne, elles sont vraiment bonnes, hehe :
1. Les avions peuvent voler et les oiseaux peuvent voler. Ils héritent tous deux de la même interface « voler » mais F22 appartient à la classe abstraite des avions et les pigeons appartiennent à la classe abstraite des oiseaux ;
2. Tout comme les portes en fer et les portes en bois sont toutes des portes (classe abstraite), je ne peux pas vous donner la porte que vous voulez (ne peut pas être instanciée), mais je peux vous donner une porte en fer ou une porte en bois spécifique (polymorphisme). ); et Il ne peut s'agir que d'une porte, on ne peut pas dire que c'est une fenêtre (héritage unique) ; une porte peut avoir une serrure (interface) ou une sonnette (implémentations multiples). La porte (classe abstraite) définit ce que vous êtes, et l'interface (serrure) stipule ce que vous pouvez faire (une interface ne doit faire qu'une chose, vous ne pouvez pas demander à la serrure d'émettre un son (pollution de l'interface)).
Ce qui précède est la différence entre les classes abstraites et les interfaces en C#. Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois (www.php.cn) !