Sobes.tech
Junior

Šta je prepisivanje (Overriding) u programiranju?

sobes.tech АИ

Одговор од АИ

Prepisivanje metode (Overriding) je mogućnost podklase da pruži sopstvenu implementaciju metode koja je već definisana u njenoj roditeljskoj klasi. Potpis metode koja se prepisuje (ime, broj i tipovi parametara) u podklasi mora potpuno odgovarati potpisu metode u roditeljskoj klasi. Tip povratne vrednosti takođe mora biti ili isti ili kovarijantan (podtip) tipa povratne vrednosti metode u roditelju.

Glavni aspekti prepisivanja:

  • Nasleđivanje: Prepisivanje je moguće samo u okviru odnosa nasleđivanja, gde podklasa nasleđuje metodu od superklase.
  • Polimorfizam: Prepisivanje je jedan od mehanizama implementacije polimorfizma u vreme izvršenja (runtime polymorphism). To znači da će, u zavisnosti od stvarnog tipa objekta, koji se poziva putem reference na tip roditelja, biti izvršena odgovarajuća implementacija metode (ili iz roditelja ili iz podklase).
  • Ključna reč @Override: U nekim jezicima (npr. Java) koristi se anotacija @Override. Ona nije obavezna za ispravno funkcionisanje prepisivanja, ali se preporučuje radi poboljšanja čitljivosti koda i sprečavanja grešaka pri kompilaciji, ako metoda ne odgovara pravilima prepisivanja.
  • Pristup roditeljskoj metodi: Unutar prepisane metode podklase često je potrebno pozvati implementaciju iste metode iz roditeljske klase. Za to se koristi ključna reč super (npr. super.metod()).

Primer u Javi:

// Roditeljska klasa
class Animal {
    // Metoda u roditeljskoj klasi
    void makeSound() {
        System.out.println("Životinja pravi zvuk");
    }
}

// Podklasa koja nasleđuje od Animal
class Dog extends Animal {
    // Prepisivanje metode makeSound()
    @Override
    void makeSound() {
        System.out.println("Vau vau!");
    }

    // Primer poziva roditeljske metode
    void eat() {
        System.out.println("Pas jede.");
        super.makeSound(); // Pozivanje metode iz roditeljske klase
    }
}

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

        myAnimal.makeSound(); // Ispisaće: Životinja pravi zvuk
        myDog.makeSound();   // Ispisaće: Vau vau! (Prepisana metoda)

        Dog specificDog = new Dog();
        specificDog.eat(); // Ispisaće: Pas jede. 
// Životinja pravi zvuk
    }
}

Primer u Pythonu:

# Roditeljska klasa
class Animal:
    # Metoda u roditeljskoj klasi
    def make_sound(self):
        print("Životinja pravi zvuk")

# Podklasa koja nasleđuje od Animal
class Dog(Animal):
    # Prepisivanje metode make_sound()
    def make_sound(self):
        print("Vau vau!")

    # Primer poziva roditeljske metode
    def eat(self):
        print("Pas jede.")
        super().make_sound() # Pozivanje metode iz roditeljske klase

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

my_animal.make_sound() # Ispisaće: Životinja pravi zvuk
my_dog.make_sound()   # Ispisaće: Vau vau!

specific_dog = Dog()
specific_dog.eat() # Ispisaće: Pas jede. 
# Životinja pravi zvuk

Prepisivanje se koristi za prilagođavanje ponašanja osnovne klase specifičnostima podklase, uz zadržavanje općeg sučelja. To je ključni element objektno-orijentiranog dizajna.