Sobes.tech
Junior

Čo je prekrývanie (Overriding) v programovaní?

sobes.tech AI

Odpoveď od AI

Prepisovanje metode (Overriding) je možnost podrazreda, da zagotovi svojo lastno implementacijo metode, ki je že določena v njenem starševskem razredu. Podpis prepisovane metode (ime, število in tipi parametrov) v podrazredu mora popolnoma sovpadati s podpisom metode v starševskem razredu. Tip vrnjene vrednosti mora biti prav tako enak ali kovarianten (podtip) tipa vrnjene vrednosti metode v starševskem razredu.

Glavni vidiki prepisovanja:

  • Dedovanje: Prepisovanje je mogoče le v okviru odnosov dedovanja, kjer podrazred deduje metodo od superrazreda.
  • Polimorfizem: Prepisovanje je eden od mehanizmov za implementacijo polimorfizma v času izvajanja (runtime polymorphism). To pomeni, da bo, odvisno od dejanskega tipa objekta, ki se kliče preko reference na tip starševskega razreda, izvedena ustrezna implementacija metode (ali iz starševskega ali iz podrazreda).
  • Ključna beseda @Override: V nekaterih jezikih (npr. Java) se uporablja anotacija @Override. Ni obvezna za pravilno delovanje prepisovanja, vendar se priporoča za izboljšanje berljivosti kode in preprečevanje napak pri prevajanju, če metoda ne ustreza pravilom prepisovanja.
  • Dostop do starševske metode: Znotraj prepisane metode podrazreda je pogosto potrebno poklicati implementacijo iste metode iz starševskega razreda. Za to se uporablja ključna beseda super (npr. super.metoda()).

Primer v Javi:

// Starševski razred
class Animal {
    // Metoda v starševskem razredu
    void makeSound() {
        System.out.println("Žival proizvaja zvok");
    }
}

// Podrazred, ki deduje od Animal
class Dog extends Animal {
    // Prepisovanje metode makeSound()
    @Override
    void makeSound() {
        System.out.println("Vau vau!");
    }

    // Primer klica starševske metode
    void eat() {
        System.out.println("Pes jeje.");
        super.makeSound(); // Klic metode iz starševskega razreda
    }
}

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

        myAnimal.makeSound(); // Izpis: Žival proizvaja zvok
        myDog.makeSound();   // Izpis: Vau vau! (Prepisana metoda)

        Dog specificDog = new Dog();
        specificDog.eat(); // Izpis: Pes jeje. 
// Žival proizvaja zvok
    }
}

Primer v Pythonu:

# Starševski razred
class Animal:
    # Metoda v starševskem razredu
    def make_sound(self):
        print("Žival proizvaja zvok")

# Podrazred, ki deduje od Animal
class Dog(Animal):
    # Prepisovanje metode make_sound()
    def make_sound(self):
        print("Vau vau!")

    # Primer klica starševske metode
    def eat(self):
        print("Pes jeje.")
        super().make_sound() # Klic metode iz starševskega razreda

# Demonstracija
my_animal = Animal()
my_dog = Dog() # Polimorfizem

my_animal.make_sound() # Izpis: Žival proizvaja zvok
my_dog.make_sound()   # Izpis: Vau vau!

specific_dog = Dog()
specific_dog.eat() # Izpis: Pes jeje. 
# Žival proizvaja zvok

Prepisovanje se uporablja za prilagoditev vedenja osnovne razreda specifikam podrazreda, ob tem pa ohranja splošno vmesnik. To je ključni element objektno usmerjenega oblikovanja.