Sobes.tech
Middle

Kedy dochádza k prepísaniu metódy (Overriding)?

sobes.tech AI

Odpoveď od AI

Prepísanie metódy (Overriding) v objektovo orientovanom programovaní nastáva, keď má podtrieda metódu s rovnakým menom, zoznamom parametrov (alebo signatúrou) a typom návratovej hodnoty ako metóda v jej rodičovskej triede. To umožňuje podtriede poskytnúť vlastnú implementáciu zdedené metódy.

Hlavné podmienky pre prepísanie:

  • Dedičnosť: Podtrieda musí dediť od rodičovskej triedy.
  • Signatúra metódy: Prepisovaná metóda v podtriede musí mať rovnakú signatúru (názov metódy a zoznam typov parametrov, ich poradie a počet), ako metóda v rodičovskej triede. V niektorých jazykoch (napríklad Java) je tiež požadované zhodné alebo kovariantné typu návratovej hodnoty.
  • Modifikátory prístupu: Modifikátor prístupu prepísanej metódy v podtriede nemôže byť restriktívnejší ako u metódy v rodičovskej triede.
  • Nie je možné prepísať: Statické (static), finálne (final v Jave, sealed v C#) a súkromné (private) metódy, pretože sa nezúčastňujú na polymorfizme cez dedičstvo.

Príklad v Jave:

// Rodičovská trieda
class Animal {
    public void sound() {
        // Výchozí implementácia
        System.out.println("Zvieracie vydáva zvuk");
    }
}

// Podtrieda prepíšuaca metódu sound()
class Dog extends Animal {
    @Override // Anotácia pre kontrolu kompilátorom
    public void sound() {
        // Špecifická implementácia pre Dog
        System.out.println("Pes štěká");
    }
}

class Main {
    public static void main(String[] args) {
        Animal myAnimal = new Animal();
        Animal myDogAsAnimal = new Dog(); // Polymorfizmus
        Dog myDog = new Dog();

        myAnimal.sound();      // Volá sound() z Animal
        myDogAsAnimal.sound(); // Volá prepísaný sound() z Dog (vďaka polymorfizmu)
        myDog.sound();         // Volá prepísaný sound() z Dog
    }
}

Príklad v Pythone:

# Rodičovská trieda
class Animal:
    def sound(self):
        # Výchozí implementácia
        print("Zvieratá vydávajú zvuk")

# Podtrieda prepíšuaca metódu sound()
class Dog(Animal):
    def sound(self):
        # Špecifická implementácia pre Dog
        print("Pes štěká")

# Použitie
my_animal = Animal()
my_dog_as_animal = Dog() # Polymorfizmus
my_dog = Dog()

my_animal.sound()       # Volá sound() z Animal
my_dog_as_animal.sound()  # Volá prepísaný sound() z Dog (vďaka polymorfizmu)
my_dog.sound()          # Volá prepísaný sound() z Dog

Prepísanie sa používa na dosiahnutie behového polymorfizmu, umožňuje vykonávať rôzne akcie v závislosti od skutočného typu objektu, aj keď používame odkaz na rodičovský triedu. Toto je kľúčový princíp OOP na tvorbu flexibilných a rozšíriteľných systémov.