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.