Co je rozhraní

  • Rozhraní je vlastně popis (specifikace) množiny vlastností tříd objektů, aniž bychom tyto vlastnosti ihned implementovali.

  • Vlastnostmi zde rozumíme především metody.

  • Říkáme, že určitá třída implementuje rozhraní, pokud implementuje (tedy ) všechny vlastnosti (tj. metody), které jsou daným rozhraním předepsány.

  • Javové rozhraní je tedy pojmenovaná množina hlaviček metod a celých specifikací, tj. popisem, co přesně má metoda dělat — vstupy/výstupy metody, její vedlejší efekty…)

Deklarace rozhraní

  • Vypadá i umisťuje se do souborů podobně jako deklarace třídy.

  • Všechny metody v rozhraní přebírají viditelnost z celého rozhraní,

  • Typicky jsou public stejně jako rozhraní.

  • V hlavičce metod se to ani nemusí uvádět.

  • Těla metod v deklaraci rozhraní se nepíší vůbec, ani prázdné závorky.

    Příklad rozhraní
    // Informing je něco, co o sobě umí vypsat informace
    public interface Informing {
       // Touto metodou je vypíše
       void writeInfo();
    }

Implementace rozhraní

Příklad implementace rozhraní
public interface Informing {
   void writeInfo();
}
public class Person implements Informing {
   public void writeInfo() {
      ... // skutečný kód metody
   }
}

Čteme: "Třída Person implementuje rozhraní Informing".

Kdy třída implementuje rozhraní

Třída implementuje rozhraní, jestliže:

  1. Třída v hlavičce uvede implements NázevRozhraní

  2. Třída implementuje všechny metody předepsané rozhraním.

Využití rozhraní

  • Potřebujeme-li u jisté proměnné právě jen funkcionalitu popsanou určitým rozhraním,

  • tuto proměnnou můžeme pak deklarovat jako typu rozhraní a ne přímo třídy, která rozhraní implementuje.

Příklad:

// "petr" stačí deklarovat jen jako Informing,
Informing petr = new Person("Petr Novák", 1945);
// jelikož jiné metody než předepsané tímto intf. nepotřebujeme
petr.writeInfo();
// nechtějme víc, než musíme

Dvě třídy implementující totéž rozhraní

  • Totéž rozhraní může být implementováno více třídami, často konceptuálně zcela nesouvisejícími.

  • Rozhraní Going ("jdoucí") implementují tři třídy:

    • Car (auto má schopnost "jít", tedy jet)

    • Clock (hodiny také "jdou")

    • Person (člověk také může chodit)

Viz příklad mezi demo-programy v ISu: car_clock.

Implementace více rozhraní

  • Jedna třída může implementovat více rozhraní současně.

  • To je účelné. V Javě totiž, na rozdíl od C++ neexistuje vícenásobná dědičnost, třída má tedy nejvýše jednoho předka (kromě třídy Object má právě jednoho).

  • Implementace více rozhraní je současně praktičtější a ušetří řadu komplikací (dědění dvěma/více cestami).

  • Využije se tam, kde po třídě chceme, aby disponovala vlastnostmi z několika často nesouvisejících různých množin, můžeme ji deklarovat tak, že implementuje více rozhraní.

Podmínky

  • Podmínkou ovšem je, aby se metody ze všech implementovaných rozhraní "snesly" v jedné třídě.

  • Nesnesou se v tomto smyslu např. dvě metody se skoro stejnou hlavičkou, lišící se jen návratovým typem

Příklad

Kromě výše uvedeného intf. Informing mějme ještě:

public interface Screaming { void scream(); }

Třída Person implementuje dvě rozhraní:

public class Person implements Informing, Screaming {
   ...
   public void writeInfo() { ... }
   public void scream() { ... }
}