Sobes.tech
Middle

Kterou metodu nelze přepsat v objektově orientovaném programování?

sobes.tech AI

Odpověď od AI

V některých jazycích, například v Ruby, nelze přímo volat metodu třídy initialize, která se používá k inicializaci nových objektů, v podtřídě jako super.initialize pro provedení logiky rodičovské třídy. Místo toho musí podtřída výslovně zavolat metodu super ve své implementaci initialize, což automaticky zavolá metodu initialize rodičovské třídy.

V jiných jazycích, například v Javě nebo C#, neexistují "uživatelské" metody, které by nebyly možné přepsat v tradičním smyslu, protože jakákoli veřejná nebo chráněná (!) metoda, která není označena jako final (Java) nebo sealed (C#), může být přepsána. Nicméně, lze považovat, že konstruktory jsou zvláštním typem "metody", kterou nelze přepsat v běžném smyslu: nelze deklarovat metodu se stejným názvem a podpisem uvnitř podtřídy, která by nahradila konstruktor rodičovské třídy. Podtřída může mít své vlastní konstruktory, které naopak volají konstruktory rodičovské třídy přes super (Java) nebo : base (C#).

class Parent {
    Parent() {
        System.out.println("Konstruktor rodiče");
    }
    void method() {
        System.out.println("Metoda rodiče");
    }
}

class Child extends Parent {
    Child() {
        // Výslovné volání konstruktoru rodiče není nutné,
        // pokud nejsou parametry, volá se automaticky.
        System.out.println("Konstruktor dítěte");
    }
    @Override // Přepsání metody je možné
    void method() {
        System.out.println("Metoda dítěte");
    }
}

Obecně lze říci, že konstruktory lze považovat za metody, které nelze přepsat ve stejném smyslu jako běžné metody.