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).
@Overrideraktinis ž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)