OOP Konceptů pro Začátečníky: Co je to Polymorfismus

OOP Konceptů pro Začátečníky: Co je to Polymorfismus

slovo polymorfismus je používán v různých souvislostech a popisuje situace, ve které se něco vyskytuje v několika různých formách. V informatice popisuje koncept, že objekty různých typů lze přistupovat prostřednictvím stejného rozhraní. Každý typ může poskytnout vlastní nezávislou implementaci tohoto rozhraní. Jedná se o jeden ze základních pojmů objektově orientovaného programování (OOP).,

Pokud vás zajímá, zda je objekt polymorfní, můžete provést jednoduchý test. Pokud objekt úspěšně projde více testů is-a nebo instanceof, je polymorfní. Jak jsem popsal ve svém příspěvku o dědičnosti, všechny třídy Java rozšiřují objekt třídy. Díky tomu jsou všechny objekty v Javě polymorfní, protože procházejí alespoň dvěma kontrolami instanceof.,

Různé typy polymorfismu

Java podporuje 2 typy polymorfismu:

  • statická nebo kompilovat-čas
  • dynamický

Statický polymorfismus

Java, stejně jako mnoho jiných objektově orientovaných jazycích, umožňuje realizovat více metod v rámci stejné třídy, které používají stejný název, ale jinou sadou parametrů. To se nazývá metoda přetížení a představuje statickou formu polymorfismu.,

parametr nastaví se liší alespoň v jedné z následujících tří kritérií:

  • musí mít různý počet parametrů, např. jedna metoda přijímá 2 a další 3 parametry.
  • typy parametrů musí být různé, např. jedna metoda přijímá Řetězec a jednu Dlouhou.
  • musí očekávat parametry v jiném pořadí, např. jedna metoda přijímá řetězec a dlouhá a druhá přijímá dlouhý a řetězec. Tento druh přetížení se nedoporučuje, protože to dělá API obtížné pochopit.,

ve většině případů každá z těchto přetížených metod poskytuje jinou, ale velmi podobnou funkci.

vzhledem k různým souborům parametrů má každá metoda jiný podpis. To umožňuje kompilátoru určit, která metoda musí být volána, a vázat ji na volání metody. Tento přístup se nazývá statická vazba nebo statický polymorfismus.

podívejme se na příklad.

jednoduchý příklad statického polymorfismu

používám stejný projekt CoffeeMachine, jaký jsem použil v předchozích příspěvcích této série. Můžete jej klonovat na https://github.com/thjanssen/Stackify-OopInheritance.,

třída BasicCoffeeMachine implementuje dvě metody s názvem brewCoffee. První z nich přijímá jeden parametr typu Kávyvýběr. Druhá metoda přijímá dva parametry, Kávuvýběr a int.

Nyní, když zavoláte jednu z těchto metod, poskytnutá sada parametrů identifikuje metodu, kterou je třeba volat.

v následujícím úryvku kódu volám metodu pouze s objektem CoffeeSelection. V době kompilace, Java kompilátor váže tuto metodu volání na metodu brewCoffee (CoffeeSelection selection).,

BasicCoffeeMachine coffeeMachine = createCoffeeMachine();coffeeMachine.brewCoffee(CoffeeSelection.FILTER_COFFEE);

Když jsem se to změnit kód a volat brewCoffee metoda s CoffeeSelection objekt a int, kompilátor se váže volání metody na druhou brewCoffee(CoffeeSelection výběr, int počet) metoda.

dynamický polymorfismus

tato forma polymorfismu neumožňuje kompilátoru určit provedenou metodu. JVM to musí udělat za běhu.

v hierarchii dědičnosti může podtřída přepsat metodu své superclass. To umožňuje vývojáři podtřídy přizpůsobit nebo zcela nahradit chování této metody.,

vytváří také formu polymorfismu. Obě metody, implementované Super-a podtřídy, sdílejí stejný název a parametry, ale poskytují různé funkce.

podívejme se na další příklad z projektu CoffeeMachine.

metoda převažující v hierarchii dědičnosti

základní třída je třída superclass třídy PremiumCoffeeMachine.

obě třídy poskytují implementaci metody brewCoffee (CoffeeSelection selection).,

Pokud si přečtete příspěvek o dědičnosti konceptu OOP, již znáte dvě implementace metody brewCoffee. Základní Kávovar podporuje pouze kávu.FILTER_COFFEE. Metoda brewCoffee třídy PremiumCoffeeMachine přidává podporu pro CoffeeSelection.KÁVOVAR. Pokud se zavolá s jinou Kávouelekce, používá klíčové slovo super k delegování hovoru na superclass.,

pozdní vazba

Pokud chcete ve svém projektu použít takovou hierarchii dědičnosti, musíte být schopni odpovědět na následující otázku: jakou metodu zavolá JVM?

, které lze odpovědět pouze za běhu, protože závisí na objektu, na kterém je metoda volána. Typ odkazu, který můžete vidět ve svém kódu, je irelevantní. Musíte rozlišit tři základní scénáře:

  1. objekt je typu z nadřazené třídy a dostane odkazuje jako nadtřídy., Takže v příkladu tohoto příspěvku je Základnícoffeemachine objekt dostane odkazoval se na jako BasicCoffeeMachine.
  2. váš objekt je typu podtřídy a dostane odkazováno jako podtřídy. V příkladu tohoto příspěvku se objekt PremiumCoffeeMachine označuje jako PremiumCoffeeMachine.
  3. váš objekt je typu podtřídy a dostane odkazoval se na jako superclass. V příkladu CoffeeMachine, PremiumCoffeeMachine objekt dostane odkazoval se na jako BasicCoffeeMachine.
Nadtřída odkazuje jako nadtřídy

první scénář je velmi jednoduchý., Když si instanci BasicCoffeeMachine objekt a uložit jej do proměnné typu BasicCoffeeMachine, JVM bude volat brewCoffee metoda na BasicCoffeeMachine třídy. Takže můžete vařit pouze Kávuvýběr.FILTER_COFFEE.

podtřídy odkazované jako podtřídy

druhý scénář je podobný. Ale tentokrát jsem instantiate PremiumCoffeeMachine a odkazovat na to jako PremiumCoffeeMachine. V tomto případě JVM nazývá metodu brewCoffee třídy PremiumCoffeeMachine, která přidává podporu pro CoffeeSelection.KÁVOVAR.,

Podtřídy odkazuje jako nadtřídy

Toto je nejzajímavější scénář a hlavní důvod, proč jsem se vysvětlit, dynamický polymorfismus v takové detaily.

Když instalujete objekt PremiumCoffeeMachine a přiřadíte jej proměnné BasicCoffeeMachine coffeemachine, je to stále objekt PremiumCoffeeMachine. Vypadá to jako Základnístroj.

kompilátor to v kódu nevidí a můžete použít pouze metody poskytované třídou BasicCoffeeMachine., Ale pokud zavoláte metodu brewCoffee na coffeemachine variable, JVM ví, že se jedná o objekt typu PremiumCoffeeMachine a provede přepsanou metodu. Tomu se říká pozdní vazba.

souhrn

polymorfismus je jedním ze základních pojmů v OOP jazycích. Popisuje koncept, že různé třídy mohou být použity se stejným rozhraním. Každá z těchto tříd může poskytnout vlastní implementaci rozhraní.

Java Podporuje dva druhy polymorfismu. Metodu můžete přetížit různými sadami parametrů., Tomu se říká statický polymorfismus, protože kompilátor staticky váže metodu na určitou metodu.

v hierarchii dědičnosti může podtřída přepsat metodu své superclass. Pokud se vám vytvořit instanci podtřídy, JVM bude vždy volat potlačené metody, i když obsazení podtřídy své nadtřídy. Tomu se říká dynamický polymorfismus.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *