Obsah
Vraťme se ještě jednou k našemu příkladu se směnárnou. Asi by vás napadly i další možnosti, jak směnárnu organizovat. Z hlediska zákazníka se však jedná stále o směnárnu, která poskytuje dvě operace - výkup a prodej, tj. má určité obecné rozhraní. Toto rozhraní můžeme v jazyce Java definovat také samostatně:
interface Smenarna { double vykup(double kolik); double prodej(double kolik); }
Součástí definice rozhraní mohou být pouze deklarace metod a konstant (označených klíčovými slovy static final). Všechny prvky rozhraní jsou veřejné a není třeba před nimi uvádět klíčové slovo public.
Definujeme-li nyní třídu, která implementuje rozhraní Smenarna, uvádíme tuto skutečnost za klíčovým slovem implements v hlavičce třídy. Můžeme tedy vytvořit dvě verze směnárny, bez poplatku a s poplatkem:
class SmenarnaBezPoplatku implements Smenarna { public SmenarnaBezPoplatku(double kurz) { this.kurz = kurz; } public double vykup(double kolik) { return kolik / kurz; } public double prodej(double kolik) { return kolik * kurz; } protected double kurz; } class SmenarnaSPoplatkem extends SmenarnaBezPoplatku { public SmenarnaSPoplatkem(double kurz, double pMin, double pProc) { super(kurz); this.pMin = pMin; this.pProc = pProc; } public double prodej(double kolik) { double castkaBezPoplatku = kolik * kurz; double poplatek = castkaBezPoplatku * pProc / 100; if( poplatek < pMin ) poplatek = pMin; return castkaBezPoplatku + poplatek; } protected double pMin; protected double pProc; }
Je zřejmé, že oba přístupy můžeme kombinovat, takže místo abychom směnárnu s poplatkem deklarovali jako zcela novou třídu, která implementuje rozhraní Smenarna, použili jsme dědičnosti.