


Journal d'apprentissage C# 23 --- Polymorphisme : surcharge d'opérateurs, surcharge de méthodes, classes abstraites, méthodes virtuelles
La définition du polymorphisme en C# est la suivante : la même opération agit sur des instances de classes différentes, différentes classes l'interprètent différemment, et produisent finalement des résultats d'exécution différents. Autrement dit, une interface, plusieurs fonctions.
C# prend en charge 2 formes de polymorphisme : le polymorphisme au moment de la compilation, le polymorphisme au moment de l'exécution
Polymorphisme au moment de la compilation :
Le polymorphisme au moment de la compilation est obtenu par surcharge
Surcharge de méthode
Vous pouvez avoir plusieurs définitions du même nom de fonction dans la même portée. Les définitions de fonctions doivent différer les unes des autres, soit par le type de paramètres dans la liste des paramètres, soit par le nombre de paramètres. Les déclarations de fonction qui diffèrent uniquement par le type de retour ne peuvent pas être surchargées. Ecrivez un exemple
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Test { class exchange //定义一个exchange类 {//方法实现交换两参数数据 public void swap(int a, int b) { int temp; temp = a; a = b; b = temp; Console.WriteLine("{0},{1}",a,b); } public void swap(string a, string b) { string temp; temp = a; a = b; b = temp; Console.WriteLine("{0},{1}", a, b); } } class program { static void Main(string[] args) { exchange exch = new exchange(); exch.swap(10, 20); //调用 swap(int a,int b)方法 exch.swap("大", "小"); //调用 swap(string a,string b)方法 } } }
Résultat :
Surcharge des opérateurs
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Test { class student //定义student类 { private int Chinese; private int Math; public void value(int a, int b) //定义一个赋值的方法,以后学了构造方法就不这么麻烦了 { Chinese = a; Math = b; } public static student operator + (student a, student b) //运算符重载,实现相加功能 { student stu = new student(); stu.Chinese = a.Chinese + b.Chinese; stu.Math = a.Math + b.Math; return stu; } public int getChinese() //获取Chinese 的方法 { return Chinese; } public int getMath() //获取Math 的方法 { return Math; } } class program { static void Main(string[] args) { student a = new student(); student b = new student(); a.value(70,80); b.value(40, 50); student stu = a + b; //70+40, 80+50 Console.WriteLine("a+b Chinese = {0}\na+b Math = {1}", stu.getChinese(), stu.getMath()); } } }
Résultat :
Polymorphisme d'exécution :
Le polymorphisme d'exécution signifie que ce n'est que lorsque le système est en cours d'exécution qu'il est décidé quelle opération implémenter en fonction de la situation réelle. Implémenté via des classes abstraites. ou des méthodes virtuelles.
Classes abstraites et méthodes abstraites
C# vous permet d'utiliser le mot-clé abstract pour créer des classes abstraites ou des méthodes abstraites Lorsqu'une classe dérivée hérite de la classe abstraite, l'implémentation est terminée. Les classes abstraites contiennent des méthodes abstraites, qui peuvent être implémentées par des classes dérivées. Les classes dérivées ont des fonctionnalités plus spécialisées. Les classes abstraites ne peuvent pas être instanciées,
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Test {//创建抽象类和抽象方法 abstract class score { public abstract int Add(); } //创建子类 class student : score { private int Chinese = 80; private int Math = 90; public override int Add() //关键字 override 实例方法 { int sum=Chinese+Math; return sum; } } class program { static void Main(string[] args) { student stu = new student(); Console.WriteLine(stu.Add() ); //结果 170 } } }
méthodes virtuelles
Les méthodes virtuelles sont déclarées à l'aide du mot clé virtual. Les méthodes virtuelles peuvent avoir différentes implémentations dans différentes classes héritées. Les appels aux méthodes virtuelles se produisent au moment de l'exécution.
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Test { class score { protected int Chinese = 80; protected int Math = 90; public virtual int Add() //定义一个虚方法 { int sum = Chinese + Math; return sum; } } //定义子类,实现方法 class student : score { public override int Add() //关键字 override 实例方法,实现相减操作 { int sub = Math - Chinese ; return sub; } } class program { static void Main(string[] args) { student stu = new student(); Console.WriteLine(stu.Add() ); //结果 10 } } }
Nous pouvons voir que la méthode réellement appelée au moment de l'exécution n'est pas une méthode virtuelle, mais la méthode après l'instance de remplacement
Ce qui précède est le journal d'apprentissage C# 23 --- Polymorphisme pour Pour plus d'informations sur la surcharge d'opérateurs, la surcharge de méthodes, les classes abstraites et les méthodes virtuelles, veuillez faire attention au site Web PHP chinois (www.php.cn) pour plus de contenu connexe !

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

L'héritage et le polymorphisme affectent le couplage des classes : l'héritage augmente le couplage car la classe dérivée dépend de la classe de base. Le polymorphisme réduit le couplage car les objets peuvent répondre aux messages de manière cohérente via des fonctions virtuelles et des pointeurs de classe de base. Les meilleures pratiques incluent l'utilisation de l'héritage avec parcimonie, la définition d'interfaces publiques, l'évitement de l'ajout de données membres aux classes de base et le découplage des classes via l'injection de dépendances. Un exemple pratique montrant comment utiliser le polymorphisme et l'injection de dépendances pour réduire le couplage dans une application de compte bancaire.

Les destructeurs sont cruciaux dans le polymorphisme C++, garantissant que les objets de classe dérivée nettoient correctement la mémoire lorsqu'ils sont détruits. Le polymorphisme permet à des objets de types différents de répondre au même appel de méthode. Le destructeur est automatiquement appelé lorsqu'un objet est détruit pour libérer sa mémoire. Le destructeur de classe dérivée appelle le destructeur de classe de base pour garantir que la mémoire de la classe de base est libérée.

Avantages et inconvénients du polymorphisme C++ : Avantages : Réutilisabilité du code : le code commun peut gérer différents types d'objets. Extensibilité : ajoutez facilement de nouvelles classes sans modifier le code existant. Flexibilité et maintenabilité : la séparation du comportement et du type améliore la flexibilité du code. Inconvénients : surcharge d'exécution : la répartition des fonctions virtuelles entraîne une augmentation de la surcharge. Complexité du code : plusieurs hiérarchies d'héritage ajoutent de la complexité. Taille binaire : l'utilisation de la fonction virtuelle augmente la taille du fichier binaire. Cas pratique : Dans la hiérarchie des classes d'animaux, le polymorphisme permet à différents objets animaux d'émettre des sons via des pointeurs animaux.

La surcharge de fonctions peut être utilisée pour obtenir un polymorphisme, dans lequel une méthode de classe dérivée est appelée via un pointeur de classe de base et le compilateur sélectionne la version surchargée en fonction des types de paramètres réels. Dans l'exemple, la classe Animal définit une fonction virtuelle makeSound() et les classes Dog et Cat réécrivent cette fonction. Lorsque makeSound() est appelée via le pointeur Animal*, le compilateur appellera la version remplacée correspondante en fonction de l'objet pointé. type, réalisant ainsi le polymorphisme sexuel.

Interface : une interface de contrat sans implémentation définit un ensemble de signatures de méthodes en Java mais ne fournit aucune implémentation concrète. Il agit comme un contrat qui oblige les classes qui implémentent l'interface à implémenter ses méthodes spécifiées. Les méthodes de l'interface sont des méthodes abstraites et n'ont pas de corps de méthode. Exemple de code : publicinterfaceAnimal{voideat();voidsleep();} Classe abstraite : plan partiellement implémenté Une classe abstraite est une classe parent qui fournit une implémentation partielle dont ses sous-classes peuvent hériter. Contrairement aux interfaces, les classes abstraites peuvent contenir des implémentations concrètes et des méthodes abstraites. Les méthodes abstraites sont déclarées avec le mot-clé abstract et doivent être remplacées par des sous-classes. Exemple de code : publicabstractcla

Dans le polymorphisme, le type de valeur de retour de fonction spécifie le type d'objet spécifique renvoyé lorsqu'une classe dérivée remplace une méthode de classe de base. Le type de valeur de retour d'une méthode de classe dérivée peut être le même que la classe de base ou plus spécifique, permettant de renvoyer davantage de types dérivés, augmentant ainsi la flexibilité.

Le polymorphisme est un concept de programmation orientée objet qui permet aux objets d'exister sous plusieurs formes, rendant le code plus flexible, évolutif et maintenable. Le polymorphisme en C++ exploite les fonctions virtuelles et l'héritage, ainsi que les fonctions virtuelles pures et les classes abstraites pour implémenter la liaison dynamique, nous permettant de créer des hiérarchies de classes qui modifient le comportement en fonction du type réel de l'objet. En pratique, le polymorphisme nous permet de créer des pointeurs de classe de base vers différents objets de classe dérivés et d'appeler les fonctions appropriées en fonction du type réel de l'objet.

La réécriture de fonctions et le polymorphisme hérité sont deux concepts clés de la POO pour obtenir des appels d'objets flexibles : Réécriture de fonctions : la classe dérivée redéfinit la fonction du même nom dans la classe de base et exécute l'implémentation spécifique dans la classe dérivée lorsqu'elle est appelée. Polymorphisme d'héritage : Une classe dérivée peut être utilisée de la même manière qu'une classe de base, et lorsqu'une méthode est appelée via une référence de classe de base, son implémentation dans la classe dérivée est exécutée.
