Polymorfismus
- Na objekt lze nahlížet z více úhlů pohledu - může být instancí více různých tříd a rozhraní (s omezeními, viz dále). Např. jeden člověk může být úředník, manžel i skaut - a dle aktuální situace tedy mít různé vlastnosti a možnosti.
- Více tříd může mít stejné metody. Např. metodu
toString()
mají všechny objekty (všechny instance všech tříd). - Metoda jednoho názvu může mít více verzí s různými seznamy argumentů (už jste viděli).
Rozhraní (interface)
- Umožňuje vynutit, aby nějaké třídy implementovaly nějaké metody (kontrakt). Typicky nějaká abstraktní vlasnost, kterou mohou mít různé spolu vůbec nesouvisející třídy.
- Příklad rozhraní Comparable zajišťuje, že třída implementuje vše potřebné k porovnávání jejich instancí.
- Typicky nejsme schopni říct, jak to jednotlivé konkrétní třídy budou dělat. Tedy konkrétní implementace těchto metod může být úplně odlišná pro různé třídy.
- Interface v Javě nemůže obsahovat žádné atributy kromě konstant. Veřejné třídní (static) metody mohou mít implementaci, veřejné instančí metody také, ale musí být označeny klíčovým slovem
default
. Soukromé metody mohou mít implementaci. - Každá třída může implementovat více rozhraní. Klíčové slovo
implements
. - Rozhraní nemůže být
final
, ale podobně jako sealed třídy existují od Java 17 i sealed rozhraní. - Instance rozhraní je každá instance každé třídy, která toto rozhraní implementuje.
Deklarace rozhraní
interface AreaAndCircuitComputable {
public double getArea();
public double getCircuit();
}
Implementace rozhraní
class Square implements AreaAndCircuitComputable {
double side;
Square(double side) {
this.side = side;
}
public double getArea() {
return side * side;
}
public double getCircuit() {
return 4 * side;
}
}
class Circle implements AreaAndCircuitComputable {
Point center;
double radius;
Square(Point center, double Radius) {
this.side = side;
}
public double getArea() {
return side * side;
}
public double getCircuit() {
return 4 * side;
}
}
class Main {
public static void main(String[] args) {
AreaAndCircuitComputable[] shapes = {
new Square(10),
new Square(20),
new Circle(new Point(1, 2), 30),
new Circle(new Point(10, 33), 22.2)
};
double totalArea = 0;
for (AreaAndCircuitComputable shape : shapes) {
totalArea += shape.getArea();
}
System.out.println("Total Area is: " + totalArea);
}
}
Úkoly
Navrhněte vhodné třídý a rozhraní tak, aby jednotlivých tříd bylo možné stejným způsobem
získat informaci pro následující UI komponenty:
Pro výpočet časového untervalu můžete použít následující kód:
LocalDateTime begin = LocalDateTime.of(2022, 10,6, 9, 38);
LocalDateTime end = LocalDateTime.now();
// Casovy interval
Duration duration = Duration.between(begin, end);
// Casovy interval v hodinach
System.out.print(duration.toHours() + " h,");
// Casovy interval v minutach
System.out.print(duration.toMinutes() + " min,");