Polymorfismus
Proč to potřebuji?
Polymorfismus umožňuje psát obecný a rozšiřitelný kód, kde stejné volání metody vyvolá různé chování podle skutečného typu objektu. Díky tomu lze přidávat nové typy bez změny existujícího kódu.
Teorie
Polymorfismus = schopnost objektu chovat se různě v závislosti na svém skutečném typu. Proměnná nadtřídy/rozhraní může odkazovat na objekt podtřídy/implementace.
Výhody: rozšiřitelnost (nové typy bez změny existujícího kódu), znovupoužitelnost, čistý kód bez if/else řetězců.
Příklady
// Rozhraní
public interface Exportovatelny {
String exportuj();
}
// Různé implementace
public class CSVExport implements Exportovatelny {
@Override
public String exportuj() {
return "data1;data2;data3";
}
}
public class JSONExport implements Exportovatelny {
@Override
public String exportuj() {
return "{\"data\": [1, 2, 3]}";
}
}
public class XMLExport implements Exportovatelny {
@Override
public String exportuj() {
return "<data><item>1</item></data>";
}
}
// Polymorfní metoda – pracuje s JAKÝMKOLIV exportérem
public class ReportGenerator {
public void generujReport(Exportovatelny exporter) {
// Neví (a nepotřebuje vědět) jaký konkrétní typ dostala
String vysledek = exporter.exportuj(); // polymorfní volání
System.out.println("Export: " + vysledek);
}
}
// Použití – snadné rozšíření o nové formáty
ReportGenerator gen = new ReportGenerator();
List<Exportovatelny> exportery = List.of(
new CSVExport(),
new JSONExport(),
new XMLExport()
);
for (Exportovatelny e : exportery) {
gen.generujReport(e); // každý se chová jinak
}
// instanceof a přetypování (pokud potřebujeme specifický typ)
Exportovatelny e = new JSONExport();
if (e instanceof JSONExport json) { // pattern matching (Java 16+)
System.out.println("Je to JSON export");
}
Shrnutí
Klíčové body
- Polymorfismus = „mnoho podob" – stejné volání, různé chování
- Závisí na dědičnosti nebo rozhraní
- Umožňuje psát obecný kód bez znalosti konkrétního typu
- Nový typ = nová třída, stávající kód se nemusí měnit