Rozšiřování rozhraní

  • Podobně jako u tříd, i rozhraní mohou být rozšiřována/specializována.

  • Na rozdíl od třídy, která dědí maximálně z jedné nadtřídy --

    • z rozhraní můžeme odvozovat potomky (podrozhraní - subinterfaces )

    • dokonce i vícenásobně - z více rozhraní odvodíme společného potomka slučujícího a rozšiřujícího vlastnosti všech předků.

Srovnání s jinými jazyky

  • Přesto to nepřináší problémy jako u klasické plné vícenásobné dědičnosti např. v C++, protože rozhraní samo:

    • nemá proměnné

    • metody neimplementuje

    • nedochází tedy k nejednoznačnostem a konfliktům při podědění neprázdných, implementovaných metod a proměnných

Rozšiřování rozhraní — příklad

Příklad: 1. Informing informuje jen trochu, 2. WellInforming je schopen ke standardním informacím (writeInfo) přidat dodatečné informace (writeDetailedInfo).

public interface Informing {
   void writeInfo();
}
public interface WellInforming extends Informing {
   void writeDetailedInfo();
}

Příklad — pokračování

  • Třída, která chce implementovat intf. WellInforming, musí implementovat obě metody předepsané tímto rozhraním.

  • Např.:

    public class Informator implements WellInforming {
       public void writeInfo() { ... // kód metody }
       public void writeDetailedInfo() { ... // kód metody }
    }

Vícenásobné rozšiřování rozhraní — správně

interface A {
   void someMethod();
}
interface B {
   void someMethod();
} interface AB extends A, B {
   // to je OK, someMethod má v obou případech
   // zcela shodnou signaturu (název, parametry, návratový typ)
}

Vícenásobné rozšiřování rozhraní — podruhé OK

interface A {
   void someMethod();
}
interface B {
   void someMethod(int param);
}
interface AB extends A, B {
   // to je OK, someMethod má různé parametry
}

Vícenásobné rozšiřování rozhraní — špatně

interface A {
   void someMethod();
}
interface B {
   int someMethod();
}
interface AB extends A, B {
   // to není OK, someMethod má jen různé návratové typy
   // parametry stejné
}

Poznámky

  • Používají se i prázdná rozhraní - nepředepisující žádnou metodu.

  • Deklarace, že třída implementuje také rozhraní, ji v tomto případě "k ničemu nezavazuje", ale poskytuje typovou informaci o dané třídě.

  • I v Java Core API jsou taková rozhraní - např. java.lang.Cloneable.