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