Rozšiřování (dědičnost) rozhraní
-
Rozhraní může převzít (můžeme říci též dědit) metody z existujících rozhraní.
-
Říkáme, že rozhraní mohou být rozšiřována (extended).
-
Rozšířené rozhraní by mělo nabízet něco navíc než to výchozí (rozšiřované).
-
Příklad: Každá třída implementující
WellInforming
musí pak implementovat i metody z rozhraníInforming
:
interface Informing {
String retrieveInfo();
}
interface WellInforming extends Informing {
String detailedInfo();
}
public class Person implements WellInforming {
public String retrieveInfo() { ... }
public String detailedInfo() { ... }
}
Kde použít implements
a kde extends
-
Ztrácíte se v klíčových slovech?
-
implements
= třída implementuje rozhraní-
ve třídě musím napsat kód (obsah) metod předepsaných rozhraním
-
-
extends
= když dědím ze třídy nebo rozšiřuji rozhraní-
dědím metody automaticky
-
Vícenásobé rozšiřování rozhraní
-
Rozhraní může dědit z více rozhraní zároveň:
public interface Informing { String retrieveInfo(); }
public interface Screaming { String scream(); }
public interface WellInforming extends Informing, Screaming {
String detailedInfo();
}
-
Každá třída implementující
WellInforming
musí implementovat všechny 3 metody.
Řetězení rozšiřování (dědičnosti)
-
Dědičnost můžeme řetězit:
public interface Grandparent { int method1(); }
public interface Parent extends Grandparent { int method2(); }
public interface Child extends Parent { int method3(); }
-
Grandparent
pak obsahuje jednu metodu,Parent
dvě,Child
tři.
Kdy je vícenásobné rozšiřování možné
-
Úplně stejné metody ze dvou rozhraní jsou OK
public interface A {
void someMethod();
}
public interface B {
void someMethod();
}
public interface AB extends A, B {
// it is OK, methods have same signature
}
Kdy je vícenásobné rozšiřování možné
-
Stejné metody s různými parametry ze dvou rozhraní jsou také OK
public interface A {
void someMethod();
}
public interface B {
void someMethod(int param);
}
public interface AB extends A, B {
// it is OK, methods have different params
}
Kdy vícenásobné rozšiřování není možné
-
Dvě metody lišící se jen návratovým typem nejsou OK
-
Třída implementující rozhraní
AB
by musela mít dvě metody lišící se jen návratovým typem, a to nejde
public interface A {
void someMethod();
}
public interface B {
int someMethod();
}
public interface AB extends A, B {
// cannot be compiled
}