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
.