Programmering

Sådan implementeres polymorfisme i C #

Polymorfisme henviser til evnen til at præsentere den samme grænseflade til forskellige former. Selvom begrebet polymorfisme er det samme på alle programmeringssprog, der understøtter det, er dets implementering forskellig fra et sprog til et andet.

De tre typer polymorfisme er overbelastning, parametrisk og inklusion. Polymorfisme hjælper med at fremme fleksibilitet i design ved at lade den samme metode have forskellige implementeringer. I det væsentlige kan du udnytte polymorfisme til at adskille grænsefladen fra implementeringen. Det fremmer genbrug af kode og adskillelse af bekymringer i din applikation.

Overbelastning af polymorfisme er en type, der findes i klasser, der er uafhængige af hinanden - de er ikke beslægtede (arv, afhængighed osv.) Med hinanden på nogen måde. Som et eksempel kan du have to forskellige klasser, der ikke er relateret til hinanden og har en metode med samme navn. Operatøroverbelastning er et eksempel på denne type polymorfisme.

Parametrisk polymorfisme eller skabelonpolymorfisme er en type, hvor du har mere end en metode i din klasse med identiske navne, men varierende parametre, dvs. de har alle de samme metodenavne, men de adskiller sig i parametrene.

Inklusionspolymorfisme er også kendt som omdefinering eller metodeoverstyring. I denne type polymorfisme kan en underklasse omdefinere en metode til baseklassen. Denne evne er også kendt som specialisering.

Parametrisk polymorfisme

Dette refererer til formen for polymorfisme, hvor du har mere end en metode i din klasse, der har samme navn, men de adskiller sig i deres metodesignaturer. En metodesignatur omfatter metodens returtype, typen af ​​parametre til metoden og rækkefølgen af ​​disse parametre. Derfor adskiller en metode, der accepterer et heltal og et tegn som argument, i signaturen fra en anden metode, der accepterer et tegn og et heltal som argumenter, selvom returtyperne for begge disse metoder (med identiske metodenavne) er de samme. Compileren bestemmer den nøjagtige metode, der skal kaldes ved at sammenligne metodesignaturerne for de overbelastede metoder.

Følgende kodeliste illustrerer, hvordan metodeoverbelastning kan implementeres.

offentlig enum Alvorligheden

    {

Informativ, advarsel, kritisk

    }

offentlig klasse Logger

    {

offentlig tomrumslog (strengbesked)

        {

// Noget kode

        }

offentlig ugyldig log (strengbesked, sværhedsgrad)

        {

// Noget kode

        }

    }

Se kodelisten ovenfor. Bemærk, hvordan metoden Log () er blevet overbelastet. Dette er et eksempel på kompileringstidspolymorfisme.

Inklusionspolymorfisme

Inklusionspolymorfisme eller tilsidesættelse af metoder kan opnås i C # ved hjælp af virtuelle metoder. I metodeoverstyring har du metoder, der har identiske signaturer til stede i både baseklassen og de afledte klasser. Du vil typisk bruge virtuelle metoder til at implementere polymorfisme i løbetid eller sen binding. Bemærk, at en virtuel metode er en, der er erklæret virtuel i basisklassen, og du kan tillade, at underklasserne af typen tilsidesætter de (n) virtuelle metode (r).

Følgende kodestykke viser to klasser - baseklassen ved navn Logger, der indeholder en virtuel metode kaldet Log og en afledt klasse ved navn FileLogger, der udvider Logger-klassen og tilsidesætter Log-metoden i baseklassen.

offentlig klasse Logger

    {

offentlig virtuel ugyldig log (strengbesked)

        {

Console.WriteLine ("Inde i Log-metoden til baseklassen Logger");

        }

    }

offentlig klasse FileLogger: Logger

    {

offentlig tilsidesættelse ugyldig log (strengbesked)

        {

Console.WriteLine ("Inde i Log-metoden i FileLogger-klassen");

        }

    }

Dette er et eksempel på metodeoverstyring. Både basis- og de afledte klasser har samme metode med identiske signaturer. Vi bruger metodeoverstyring til at implementere polymorfisme eller sen binding. Følgende kodestykke viser, hvordan Log-metoden kan kaldes ved hjælp af en reference fra baseklassen.

statisk ugyldigt Main (streng [] args)

        {

Logger logger = ny FileLogger ();

logger.Log ("Hello World!");

Console.ReadKey ();

        }

Når du udfører ovenstående kodestykke, vil Log-metoden for den afledte klasse, dvs. Filelogger-klassen påberåbes. Hvis Log-metoden ikke blev deklareret som virtuel i baseklassen, ville basisversionen af ​​Log-metoden i stedet være blevet kaldt. Da denne binding forekommer sent ved kørselstid, er denne type polymorfisme kendt som kørselstidspolymorfisme eller sen binding.

$config[zx-auto] not found$config[zx-overlay] not found