Comment implémenter le polymorphisme en C #

Le polymorphisme fait référence à la capacité de présenter la même interface pour différentes formes. Bien que le concept de polymorphisme soit le même dans tous les langages de programmation qui le supportent, son implémentation diffère d'un langage à l'autre.

Les trois types de polymorphisme sont la surcharge, le paramétrique et l'inclusion. Le polymorphisme aide à promouvoir la flexibilité des conceptions en permettant à la même méthode d'avoir des implémentations différentes. En substance, vous pouvez tirer parti du polymorphisme pour séparer l'interface de l'implémentation. Il favorise la réutilisation du code et la séparation des préoccupations dans votre application.

Le polymorphisme de surcharge est un type qui existe dans des classes indépendantes les unes des autres - elles ne sont en aucun cas liées (héritage, dépendance, etc.) les unes aux autres. À titre d'exemple, vous pouvez avoir deux classes distinctes qui ne sont en aucun cas liées entre elles et ayant une méthode avec le même nom. La surcharge d'opérateurs est un exemple de ce type de polymorphisme.

Le polymorphisme paramétrique, ou polymorphisme de modèle, est un type où vous avez plus d'une méthode dans votre classe avec des noms identiques mais des paramètres variables, c'est-à-dire qu'elles ont toutes les mêmes noms de méthodes, mais elles diffèrent dans les paramètres.

Le polymorphisme d'inclusion est également appelé redéfinition ou remplacement de méthode. Dans ce type de polymorphisme, une sous-classe peut redéfinir une méthode de la classe de base. Cette capacité est également connue sous le nom de spécialisation.

Polymorphisme paramétrique

Cela fait référence à la forme de polymorphisme où vous avez plus d'une méthode dans votre classe qui porte le même nom mais qui diffèrent dans leurs signatures de méthode. Une signature de méthode comprend le type de retour de la méthode, le type des paramètres de la méthode et la séquence de ces paramètres. Par conséquent, une méthode qui accepte un entier et un caractère comme argument diffère dans la signature d'une autre méthode qui accepte un caractère et un entier comme arguments même si les types de retour de ces deux méthodes (ayant des noms de méthode identiques) sont les mêmes. Le compilateur détermine la méthode exacte à appeler en comparant les signatures de méthode des méthodes surchargées.

La liste de code suivante illustre comment la surcharge de méthode peut être implémentée.

public enum Severity

    {

        Informational, Warning, Critical

    }

    public class Logger

    {

        public void Log(string message)

        {

            //Some code

        }

        public void Log(string message, Severity severity)

        {

            //Some code

        }

    }

Reportez-vous à la liste des codes ci-dessus. Notez comment la méthode Log () a été surchargée. Ceci est un exemple de polymorphisme au moment de la compilation.

Polymorphisme d'inclusion

Le polymorphisme d'inclusion, ou le remplacement de méthode, peut être réalisé en C # à l'aide de méthodes virtuelles. Dans le remplacement de méthode, vous avez des méthodes ayant des signatures identiques présentes à la fois dans les classes de base et dérivées. Vous souhaiterez généralement utiliser des méthodes virtuelles pour implémenter un polymorphisme d'exécution ou une liaison tardive. Notez qu'une méthode virtuelle est une méthode déclarée comme virtuelle dans la classe de base et vous pouvez autoriser les sous-classes du type à remplacer la ou les méthodes virtuelles.

L'extrait de code suivant montre deux classes: la classe de base nommée Logger qui contient une méthode virtuelle appelée Log et une classe dérivée nommée FileLogger qui étend la classe Logger et remplace la méthode Log de la classe de base.

public class Logger

    {

        public virtual void Log(string message)

        {

            Console.WriteLine("Inside the Log method of the base class Logger");

        }

    }

    public class FileLogger : Logger

    {

        public override void Log(string message)

        {

            Console.WriteLine("Inside the Log method of the FileLogger class");

        }

    }

Ceci est un exemple de remplacement de méthode. La base et les classes dérivées ont la même méthode avec des signatures identiques. Nous utilisons la substitution de méthode pour implémenter le polymorphisme d'exécution ou la liaison tardive. L'extrait de code suivant montre comment la méthode Log peut être appelée à l'aide d'une référence de la classe de base.

static void Main(string[] args)

        {

            Logger logger = new FileLogger();

            logger.Log("Hello World!");

            Console.ReadKey();

        }

Lorsque vous exécutez l'extrait de code ci-dessus, la méthode Log de la classe dérivée, c'est-à-dire la classe Filelogger, est appelée. Si la méthode Log n'a pas été déclarée comme virtuelle dans la classe de base, la version de base de la méthode Log aurait été appelée à la place. Étant donné que cette liaison se produit tard au moment de l'exécution, ce type de polymorphisme est appelé polymorphisme d'exécution ou liaison tardive.