Programovanie

Ako implementovať polymorfizmus v C #

Polymorfizmus označuje schopnosť prezentovať rovnaké rozhranie pre rôzne formy. Aj keď je koncept polymorfizmu rovnaký vo všetkých programovacích jazykoch, ktoré ho podporujú, jeho implementácia sa v jednotlivých jazykoch líši.

Tri typy polymorfizmu sú preťaženie, parametrické a inkluzívne. Polymorfizmus pomáha podporovať flexibilitu v dizajnoch tým, že umožňuje, aby rovnaká metóda mala rôzne implementácie. V zásade môžete využiť polymorfizmus na oddelenie rozhrania od implementácie. Vo vašej aplikácii podporuje opätovné použitie kódu a oddelenie záujmov.

Preťaženie polymorfizmu je typ, ktorý existuje v triedach, ktoré sú navzájom nezávislé - nijako nesúvisia (dedičnosť, závislosť atď.). Napríklad môžete mať dve odlišné triedy, ktoré navzájom nijako nesúvisia a majú metódu s rovnakým názvom. Preťaženie operátora je príkladom tohto typu polymorfizmu.

Parametrický polymorfizmus alebo šablónový polymorfizmus je typ, kedy máte vo svojej triede viac ako jednu metódu s rovnakými názvami, ale s rôznymi parametrami, t. J. Všetci majú rovnaké názvy metód, líšia sa však v parametroch.

Inklúzny polymorfizmus je tiež známy ako predefinovanie alebo prevládajúca metóda. V tomto type polymorfizmu môže podtrieda predefinovať metódu základnej triedy. Táto schopnosť sa tiež nazýva špecializácia.

Parametrický polymorfizmus

Toto sa týka formy polymorfizmu, keď máte vo svojej triede viac ako jednu metódu, ktorá má rovnaký názov, ale líšia sa svojimi podpismi metód. Podpis metódy pozostáva z návratového typu metódy, typu parametrov k metóde a postupnosti týchto parametrov. Preto sa metóda, ktorá prijíma celé číslo a znak ako argument, líši v podpise od inej metódy, ktorá prijíma znak a celé číslo ako argumenty, aj keď sú návratové typy oboch týchto metód (majúcich rovnaké názvy metód) rovnaké. Kompilátor určuje presnú metódu, ktorá sa má volať, porovnaním podpisov metód preťažených metód.

Nasledujúci zoznam kódov ilustruje, ako je možné implementovať preťaženie metódy.

public enum Závažnosť

    {

Informačné, varovné, kritické

    }

verejná trieda Logger

    {

public void Log (reťazcová správa)

        {

// Nejaký kód

        }

public void Log (reťazcová správa, závažnosť závažnosti)

        {

// Nejaký kód

        }

    }

Prečítajte si zoznam kódov vyššie. Všimnite si, ako bola metóda Log () preťažená. Toto je príklad polymorfizmu času kompilácie.

Inklúzny polymorfizmus

Inklúzny polymorfizmus alebo prepísanie metódy je možné dosiahnuť v C # pomocou virtuálnych metód. V prepísaní metódy máte metódy, ktoré majú identické podpisy prítomné v základnej aj v odvodenej triede. Spravidla by ste chceli použiť virtuálne metódy na implementáciu run-time polymorfizmu alebo neskorej väzby. Upozorňujeme, že virtuálna metóda je taká, ktorá je v základnej triede deklarovaná ako virtuálna, a môžete povoliť, aby podtriedy typu prepísali virtuálne metódy.

Nasledujúci úryvok kódu zobrazuje dve triedy - základnú triedu s názvom Logger, ktorá obsahuje virtuálnu metódu nazvanú Log, a odvodenú triedu s názvom FileLogger, ktorá rozširuje triedu Logger a prepíše metódu Log základnej triedy.

verejná trieda Logger

    {

verejný virtuálny neplatný protokol (reťazcová správa)

        {

Console.WriteLine ("Vo vnútri metódy Log základnej triedy Logger");

        }

    }

verejná trieda FileLogger: Logger

    {

public override void Log (reťazcová správa)

        {

Console.WriteLine ("Vnútri metódy Log triedy FileLogger");

        }

    }

Toto je príklad prepísania metódy. Základná aj odvodená trieda majú rovnakú metódu s identickými podpismi. Používame prepísanie metódy na implementáciu polymorfizmu chodu alebo neskorej väzby. Nasledujúci úryvok kódu ukazuje, ako možno metódu Log nazvať pomocou odkazu na základnú triedu.

static void Main (reťazec [] args)

        {

Logger logger = nový FileLogger ();

logger.Log („Hello World!“);

Console.ReadKey ();

        }

Pri vykonávaní vyššie uvedeného fragmentu kódu sa vyvolá metóda Log odvodenej triedy, t. J. Triedy Filelogger. Ak by metóda Log nebola v základnej triede deklarovaná ako virtuálna, namiesto nej by bola zavolaná základná verzia metódy Log. Pretože táto väzba sa vyskytuje neskoro za behu, je tento typ polymorfizmu známy ako behúňový polymorfizmus alebo neskorá väzba.

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