Programování

Jak implementovat polymorfismus v C #

Polymorfismus označuje schopnost prezentovat stejné rozhraní pro různé formy. Ačkoli je koncept polymorfismu stejný ve všech programovacích jazycích, které jej podporují, jeho implementace se liší od jednoho jazyka k druhému.

Tři typy polymorfismu jsou přetížení, parametrické a inkluze. Polymorfismus pomáhá podporovat flexibilitu návrhů tím, že umožňuje stejné metodě mít různé implementace. V podstatě můžete využít polymorfismus k oddělení rozhraní od implementace. Podporuje opětovné použití kódu a oddělení obav ve vaší aplikaci.

Přetížení polymorfismu je typ, který existuje ve třídách, které jsou na sobě nezávislé - nijak nesouvisí (dědičnost, závislost atd.). Jako příklad můžete mít dvě odlišné třídy, které spolu nijak nesouvisí a mají metodu se stejným názvem. Přetížení operátoru je příkladem tohoto typu polymorfismu.

Parametrický polymorfismus nebo polymorfismus šablony je typ, kdy ve své třídě máte více než jednu metodu se stejnými názvy, ale s různými parametry, tj. Všechny mají stejné názvy metod, ale liší se v parametrech.

Polymorfismus inkluze je také známý jako redefinice nebo přepsání metody. V tomto typu polymorfismu může dílčí třída předefinovat metodu základní třídy. Tato schopnost se také nazývá specializace.

Parametrický polymorfismus

To se týká formy polymorfismu, kdy máte ve své třídě více než jednu metodu se stejným názvem, ale liší se podpisy metod. Podpis metody se skládá z návratového typu metody, typu parametrů k metodě a pořadí těchto parametrů. Proto se metoda, která jako argument přijímá celé číslo a znak, liší v podpisu od jiné metody, která jako argument přijímá znak a celé číslo, i když jsou návratové typy obou těchto metod (mající shodné názvy metod) stejné. Kompilátor určuje přesnou metodu, která má být volána, porovnáním podpisů metod přetížených metod.

Následující výpis kódu ukazuje, jak lze implementovat přetížení metody.

veřejné výčet Závažnost

    {

Informační, výstražné, kritické

    }

veřejná třída Logger

    {

public void Log (řetězcová zpráva)

        {

// Nějaký kód

        }

public void Log (řetězcová zpráva, závažnost závažnosti)

        {

// Nějaký kód

        }

    }

Viz výše uvedený seznam kódů. Všimněte si, jak byla metoda Log () přetížena. Toto je příklad polymorfismu času kompilace.

Polymorfismus inkluze

Polymorfismus začlenění nebo přepsání metody lze dosáhnout v C # pomocí virtuálních metod. V přepsání metody máte metody, které mají identické podpisy přítomné jak v základní, tak v odvozené třídě. Obvykle byste chtěli použít virtuální metody k implementaci běhového polymorfismu nebo pozdní vazby. Všimněte si, že virtuální metoda je deklarována jako virtuální v základní třídě a můžete povolit, aby podtřídy typu přepsaly virtuální metodu.

Následující fragment kódu ukazuje dvě třídy - základní třídu s názvem Logger, která obsahuje virtuální metodu nazvanou Log a odvozenou třídu s názvem FileLogger, která rozšiřuje třídu Logger a přepíše Log metodu základní třídy.

veřejná třída Logger

    {

veřejný virtuální neplatný protokol (řetězcová zpráva)

        {

Console.WriteLine ("Uvnitř metody Log základní třídy Logger");

        }

    }

veřejná třída FileLogger: Logger

    {

public override void Log (zpráva řetězce)

        {

Console.WriteLine ("Uvnitř metody Log třídy FileLogger");

        }

    }

Toto je příklad přepsání metody. Základní i odvozené třídy mají stejnou metodu se stejnými podpisy. K implementaci běhového polymorfismu nebo pozdní vazby používáme přepsání metody. Následující fragment kódu ukazuje, jak lze Log metodu volat pomocí odkazu na základní třídu.

static void Main (řetězec [] args)

        {

Logger logger = nový FileLogger ();

logger.Log („Hello World!“);

Console.ReadKey ();

        }

Když spustíte výše uvedený fragment kódu, vyvolá se metoda Log odvozené třídy, tj. Třídy Filelogger. Pokud by metoda Log nebyla v základní třídě deklarována jako virtuální, místo toho by byla volána základní verze metody Log. Protože k této vazbě dochází pozdě za běhu, je tento typ polymorfismu známý jako běhový polymorfismus nebo pozdní vazba.

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