Programmering

Hvordan implementere polymorfisme i C #

Polymorfisme refererer til evnen til å presentere det samme grensesnittet for forskjellige former. Selv om begrepet polymorfisme er det samme i alle programmeringsspråk som støtter det, er implementeringen forskjellig fra ett språk til et annet.

De tre typene polymorfisme er overbelastning, parametrisk og inkludering. Polymorfisme bidrar til å fremme fleksibilitet i design ved å la den samme metoden ha forskjellige implementeringer. I hovedsak kan du utnytte polymorfisme for å skille grensesnitt fra implementering. Det fremmer gjenbruk av kode og separasjon av bekymringer i applikasjonen din.

Overbelastning av polymorfisme er en type som eksisterer i klasser som er uavhengige av hverandre - de er ikke relatert (arv, avhengighet osv.) Til hverandre på noen måte. Som et eksempel kan du ha to forskjellige klasser som ikke er relatert på noen måte med hverandre og har en metode med samme navn. Overbelastning av operatører er et eksempel på denne typen polymorfisme.

Parametrisk polymorfisme, eller malpolymorfisme, er en type der du har mer enn en metode i klassen din med identiske navn, men varierende parametere, dvs. de har alle de samme metodenavnene, men de er forskjellige i parameterne.

Inkluderingspolymorfisme er også kjent som omdefinering eller overstyring av metoden. I denne typen polymorfisme kan en underklasse omdefinere en metode for basisklassen. Denne evnen er også kjent som spesialisering.

Parametrisk polymorfisme

Dette refererer til formen for polymorfisme der du har mer enn en metode i klassen din som har samme navn, men de skiller seg ut i metodesignaturer. En metodesignatur består av returtypen til metoden, typen av parametere til metoden og sekvensen av disse parametrene. Derfor skiller en metode som godtar et heltall og et tegn som argument, i signaturen fra en annen metode som godtar et tegn og et heltall som argumenter, selv om returtypene til begge disse metodene (som har identiske metodenavn) er de samme. Kompilatoren bestemmer den nøyaktige metoden som skal kalles ved å sammenligne metodesignaturene til de overbelastede metodene.

Følgende kodeliste illustrerer hvordan metodeoverbelastning kan implementeres.

offentlig enum Alvorlighetsgrad

    {

Informativ, advarsel, kritisk

    }

offentlig klasse Logger

    {

offentlig ugyldig logg (strengmelding)

        {

// Noe kode

        }

offentlig ugyldig logg (strengmelding, alvorlighetsgrad)

        {

// Noe kode

        }

    }

Se kodelisten ovenfor. Legg merke til hvordan Log () -metoden har blitt overbelastet. Dette er et eksempel på kompileringstidspolymorfisme.

Inkludering polymorfisme

Inkluderingspolymorfisme, eller metodeoverstyring, kan oppnås i C # ved hjelp av virtuelle metoder. I metodeoverstyring har du metoder som har identiske signaturer til stede i både basisklassen og de avledede klassene. Du vil vanligvis bruke virtuelle metoder for å implementere polymorfisme eller sen binding. Merk at en virtuell metode er en som er erklært som virtuell i baseklassen, og du kan la underklassene av typen overstyre den / de virtuelle metoden (e).

Følgende kodebit viser to klasser - baseklassen med navnet Logger som inneholder en virtuell metode kalt Logg og en avledet klasse med navnet FileLogger som utvider Logger-klassen og overstyrer Logg-metoden til baseklassen.

offentlig klasse Logger

    {

offentlig virtuell ugyldig logg (strengmelding)

        {

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

        }

    }

offentlig klasse FileLogger: Logger

    {

offentlig overstyring ugyldig logg (strengmelding)

        {

Console.WriteLine ("Inne i Logg-metoden i FileLogger-klassen");

        }

    }

Dette er et eksempel på metodeoverstyring. Både basen og de avledede klassene har samme metode med identiske signaturer. Vi bruker metodeoverstyring for å implementere polymorfisme eller sen binding. Følgende kodebit viser hvordan Log-metoden kan kalles ved hjelp av en referanse til baseklassen.

statisk tomrom Main (streng [] args)

        {

Logger logger = ny FileLogger ();

logger.Log ("Hello World!");

Console.ReadKey ();

        }

Når du utfører kodebiten ovenfor, vil Log-metoden for den avledede klassen, dvs. Filelogger-klassen, påberopes. Hvis Logg-metoden ikke ble erklært som virtuell i baseklassen, ville baseversjonen av Logg-metoden blitt kalt i stedet. Siden denne bindingen skjer sent ved kjøretid, er denne typen polymorfisme kjent som kjøretidspolymorfisme eller sen binding.