..
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.
| |
Ruby a Ruby on Rails (kurz)
Vytvořit software a webových aplikací s Ruby a RoR. Od 39 €. |