..


Sponzorované odkazy

Polymorfismus a Duck psaní v Ruby

Článek napsal Alessio Saltarini
Strana 1 z 2

Polymorfismus je programovací technika, která umožňuje použití části zdrojového kódu, zatímco zůstane beze změny, ke generování run-time chování.

Vytvoření polymorfní kód má svůj zvláštní význam v objektově orientovaného programování: to znamená vytvořit taxonomii všech tříd, které implementují rozhraní.

Takže pokud například můj rozhraní definuje metodu "getArea", z nichž každá třída, která bude implementovat toto rozhraní bude mít metodu "getArea": ​​To nám umožňuje psát polymorfní metody, metody, které mohou změnit jejich algoritmus provedení V závislosti na typu objektu, který je předán jako argument.

Polymorfismus v tradičním OOP jazyků

V jazyce Java - ale totéž platí i pro C + + a dalších jazyků, objektově orientovaný (OO) dokončen, budeme ruce případě Ruby - například:






 Rozhraní IFormaGeometrica







 {



   



 neplatné getArea ();







 }









 public class trojúhelník implementuje IFormaGeometrica







 {



 



 @ Override



 



 public int getArea ()



 



 {



  



 návrat (* this.base this.altezza) / 2;



 



 }







 }



V tomto případě definujeme rozhraní IFormaGeometrica, který říká, že každý objekt, který "je" FormaGeometrica getArea bude mít metodu - např. trojúhelník třídy, která je FormaGeometrica, má svou vlastní implementaci getArea, což nám umožňuje napsat program schopen vypočítat oblasti všechny geometrické tvary, ať už to je v současné době působí v kódu, a které budou realizovány v budoucnosti, aniž by se původní zdrojový kód.

Ve skutečnosti, pokud bych napsat třídu Calculator:






 public final class kalkulačka







 {





 



 public static void main (String [] args)



 



 {



  



 Sběr formy <IFormaGeometrica> =



          



 <IFormaGeometrica> New ArrayList ();





  



 forme.add (nový trojúhelník ());



  



 forme.add (nové náměstí ());



  



 forme.add (nové Pentagon ());





  



 pro (IFormaGeometrica g: Forma)



  



 {



   



 System.out.println (g.calcolaArea ());



  



 }



 



 }







 }



To může trvat jako vstupní nějaké sbírky geometrických tvarů, za předpokladu, že každý objekt v kolekci musí implementovat rozhraní IFormaGeometrica, a že má v podstatě metoda getArea. Tento příklad v jazyce Java je čistě akademický: ve skutečnosti, asi v konstruktoru každé třídy, budeme zahrnovat vstupní opatření stran geometrického tvaru, sklonu, a tak dále.

Cílem je dosáhnout: jsme napsali třídu, která umožňuje tisk na video na oblast všechny geometrické tvary. Opakuji: to je kód, který již byl realizován (jako v případě trojúhelník), který je realizován v budoucnosti.

Nejen, že: v případě, že provedení výpočtu plochy trojúhelníku obsahovala chybu, mohu změnit třídu, aniž by museli přepisovat třídy trojúhelník Kalkulačka. Možná to byla nasazena na serveru, který je potřeba restartovat každou změnu: v tomto případě nebude muset změnit kód je velkou výhodou. Ale jiné, než to, že je vždy výhodné pro omezení na části kódu, že "změna", protože každá změna s sebou přináší potenciální chyby. Naopak, je to dobrý programovací praxi vždy s jistotou vědět, které části kódu, které se nemění.

Co se děje "za scénou", je to, že překladač je, že každý objekt v polymorfní kód hlavní metodu třídy Kalkulačka implementuje rozhraní. Tímto způsobem, říkají, že je výraz v metodologii konstrukce smlouvou "smlouva je respektována."

Pokud tomu tak není, pokud je to v "formy" má objekt třídy, která se nebude realizovat IFormaGeometrica chybu při kompilaci, nebo se nepodaří spustit program, protože kompilátor si všimli chyby.

Polymorfismus v Ruby

Ale co se stane v Ruby? A "lze v Ruby, který není sestaven, ale interpretovaný jazyk, psaní polymorfní metody?

Ano, to je jistě možné, ale je zde obrovský rozdíl "filozofický", než OO jazyky a sestaven, které

bychom mohli popsat. OO programování v jazyce Java a Classic, prokázat, že objekt patří do určitého typu objektů (implementující určité rozhraní) je třeba výslovně objekt pochází z rodičovské třídy: V zásadě musíte použít techniky dědictví (zdědění od třídy, abstraktní třídy nebo interface).

To by bylo jako tvrdit, že: Chcete-li zjistit, zda se jedná o kachnu přede mnou, jsem si jeho DNA a studovat v laboratoři, aby zjistili, zda je pro kachny.

V Ruby se, že používáte "kachní test" (kachna test) vynalezl James Riley (viz http://en.wikipedia.org/wiki/Duck_typing ):

Pokud to chodí jako kachna a kváká to jako kachna, pak je to kachna.

(Což mimochodem je to, co dělá každého z nás, když vidí kachny).

Co to znamená? To znamená, že v Ruby, a obecněji v objektově orientovaný skriptovací jazyky, stejně jako Python a Perl, není nutné specifikovat rozhraní, ani explicitní dědické vztahy mezi třídami.

Tlumočníka pouze "věřit", že programátor, způsob kroky při polymorfní objekt, který "by měl mít" určitým způsobem, ve skutečnosti máme.

Ve stejné kategorii ...
E-Learning
Ruby a Ruby on Rails (kurz) Ruby a Ruby on Rails (kurz)
Vytvořit software a webových aplikací s Ruby a RoR. Od 39 €.
Sponzorované odkazy