Sobes.tech
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 (final Java kalboje, sealed C# 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.