Middle
Kada įvyksta metodo perrašymas (Overriding)?
sobes.tech AI
Atsakymas iš AI
Objekto orientuoto programavimo metu metodų perrašymas (Overriding) įvyksta, kai vaikų klasė turi metodą su tuo pačiu pavadinimu, parametrų sąrašu (arba signatūra) ir grąžinamojo tipo kaip ir tėvų klasės metode. Tai leidžia vaikų klasei pateikti savo pačios įgyvendinimą paveldėtame metode.
Pagrindiniai reikalavimai perrašymui:
- Paveldėjimas: Vaikų klasė turi paveldėti iš tėvų klasės.
- Metodo signatūra: Perrašomas metodas vaikų klasėje turi turėti tą pačią signatūrą (metodo pavadinimą ir parametrų tipų sąrašą, jų tvarką ir skaičių), kaip ir tėvų klasės metode. Kai kuriose kalbose (pvz., Java) taip pat reikalingas grąžinamojo tipo sutapimas arba kovariantiškumas.
- Prieigos modifikatoriai: Perrašyto metodo prieigos modifikatorius vaikų klasėje negali būti griežtesnis nei tėvų klasės metode.
- Negalima perrašyti: Statiniai (
static), galutiniai (finalJava kalboje,sealedC# kalboje) ir privačios (private) metodai, nes jie nedalyvauja polimorfizme per paveldėjimą.
Pavyzdys Java:
// Tėvų klasė
class Animal {
public void sound() {
// Numatytoji įgyvendinimas
System.out.println("Gyvūnas skleidžia garsą");
}
}
// Vaikų klasė, perrašanti metodą sound()
class Dog extends Animal {
@Override // Anotacija patikrinimui kompiliatoriaus
public void sound() {
// Specifinis įgyvendinimas šunims
System.out.println("Šuo loja");
}
}
class Main {
public static void main(String[] args) {
Animal myAnimal = new Animal();
Animal myDogAsAnimal = new Dog(); // Polimorfizmas
Dog myDog = new Dog();
myAnimal.sound(); // Iškviečia Animal sound()
myDogAsAnimal.sound(); // Iškviečia perrašytą Dog sound() (dėl polimorfizmo)
myDog.sound(); // Iškviečia perrašytą Dog sound()
}
}
Python pavyzdys:
# Tėvų klasė
class Animal:
def sound(self):
# Numatytoji įgyvendinimas
print("Gyvūnas skleidžia garsą")
# Vaikų klasė, perrašanti metodą sound()
class Dog(Animal):
def sound(self):
# Specifinis įgyvendinimas šunims
print("Šuo loja")
# Naudojimas
my_animal = Animal()
my_dog_as_animal = Dog() # Polimorfizmas
my_dog = Dog()
my_animal.sound() # Iškviečia Animal sound()
my_dog_as_animal.sound() # Iškviečia perrašytą Dog sound() (dėl polimorfizmo)
my_dog.sound() # Iškviečia perrašytą Dog sound()
Perrašymas naudojamas siekiant pasiekti vykdymo laiko polimorfizmą, leidžiantį vykdyti skirtingas veiklas priklausomai nuo objekto tikrojo tipo, nepaisant to, kad naudojame nuorodą į tėvų klasę. Tai yra pagrindinis OOP principas, skirtas kurti lankstesnes ir išplečiamas sistemas.