2.4. Rozhraní

Obsah

2.4.1. Úlohy k řešení

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.