Sobes.tech
Junior

Kas yra perrašymas (Overriding) programavime?

sobes.tech AI

Atsakymas iš AI

Perrašymas (Overriding) yra galimybė pogrupiui pateikti savo pačią įgyvendinimą jau apibrėžtam metodui, kuris yra jo tėvų klasėje. Perrašomo metodo (vardas, parametrų skaičius ir tipai) parašas pogrupyje turi visiškai atitikti tėvų klasės metodo parašą. Grąžinimo tipas taip pat turi būti arba tas pats, arba kovariantas (pavaldinis) tėvų metodo grąžinimo tipo.

Pagrindiniai aspektai:

  • Paveldėjimas: Perrašymas galimas tik paveldėjimo santykiuose, kur pogrupis paveldi metodą iš tėvų klasės.
  • Polimorfizmas: Perrašymas yra vienas iš vykdymo laiko polimorfizmo mechanizmų. Tai reiškia, kad priklausomai nuo faktinio objekto tipo, kuris iškviečiamas per tėvų tipo nuorodą, bus vykdoma atitinkama metodo realizacija (iš tėvų ar iš pogrupio).
  • @Override raktinis žodis: Kai kuriose kalbose (pavyzdžiui, Java) naudojama anotacija @Override. Ji nėra būtina teisingam perrašymo veikimui, tačiau rekomenduojama geresniam kodo skaitomumui ir kompiliatoriaus klaidų išvengimui, jei metodas neatitinka perrašymo taisyklių.
  • Prieiga prie tėvų metodo: Perrašyto metodo viduje dažnai reikia iškviesti tą patį metodo realizaciją iš tėvų klasės. Tam naudojamas raktinis žodis super (pavyzdžiui, super.metodas()).

Java pavyzdys:

// Tėvų klasė
class Animal {
    // Metodas tėvų klasėje
    void makeSound() {
        System.out.println("Gyvūnas skleidžia garsą");
    }
}

// Pogrupis, paveldintis iš Animal
class Dog extends Animal {
    // `makeSound()` metodo perrašymas
    @Override
    void makeSound() {
        System.out.println("Au au!");
    }

    // Pavyzdys, kaip iškviesti tėvų metodą
    void eat() {
        System.out.println("Šuo valgo.");
        super.makeSound(); // iškviečiame tėvų metodo realizaciją
    }
}

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

        myAnimal.makeSound(); // išves: Gyvūnas skleidžia garsą
        myDog.makeSound();   // išves: Au au! (perrašytas metodas)

        Dog specificDog = new Dog();
        specificDog.eat(); // išves: Šuo valgo. 
 // Au au! (tėvų metodo iškvietimas)
    }
}

Python pavyzdys:

# Tėvų klasė
class Animal:
    # Metodas tėvų klasėje
    def make_sound(self):
        print("Gyvūnas skleidžia garsą")

# Pogrupis, paveldintis iš Animal
class Dog(Animal):
    # `make_sound()` metodo perrašymas
    def make_sound(self):
        print("Au au!")

    # Pavyzdys, kaip iškviesti tėvų metodą
    def eat(self):
        print("Šuo valgo.")
        super().make_sound() # iškviečiame tėvų metodo realizaciją

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

my_animal.make_sound() # išves: Gyvūnas skleidžia garsą
my_dog.make_sound()   # išves: Au au!

specific_dog = Dog()
specific_dog.eat() # išves: Šuo valgo. 
 # Au au! (tėvų metodo iškvietimas)