Sobes.tech
Junior

Kas ir pārrakstīšana (Overriding) programmēšanā?

sobes.tech AI

Atbilde no AI

Pārklāšana (Overriding) ir iespēja apakšklasei sniegt savu īstenojumu jau definētam metodei, kas ir tās vecāku klasē. Pārklājamās metodes (vārds, parametru skaits un tipi) paraksts apakšklasē ir pilnībā jāatbilst vecāku klases metodes parakstam. Atgriešanas tips arī ir jābūt vai nu tam pašam, vai kovariantam (pavaldnieka tipam) vecāku metodes atgriešanas tipam.

Galvenie aspekti:

  • Mantošana: Pārklāšana ir iespējama tikai mantošanas attiecībās, kur apakšklase manto metodi no vecāku klases.
  • Polimorfisms: Pārklāšana ir viens no izpildes laika polimorfisma mehānismiem. Tas nozīmē, ka atkarībā no faktiskā objekta tipa, kas tiek izsaukts caur vecāku tipa saiti, tiks izpildīta atbilstošā metode (no vecāku vai apakšklases).
  • @Override atslēgvārds: Dažās valodās (piemēram, Java) tiek izmantota anotācija @Override. Tā nav obligāta pareizai pārklāšanai, bet ieteicama koda lasāmības uzlabošanai un kompilācijas kļūdu novēršanai, ja metode neatbilst pārklāšanas noteikumiem.
  • Piekļuve vecāku metodei: Pārklājamās metodes iekšpusē bieži ir nepieciešams izsaukt to pašu metodes realizāciju no vecāku klases. Tam tiek izmantots atslēgvārds super (piemēram, super.metode()).

Java piemērs:

// Vecāku klase
class Animal {
    // Metode vecāku klasē
    void makeSound() {
        System.out.println("Dzīvnieks izdod skaņu");
    }
}

// Apakšklase, kas manto no Animal
class Dog extends Animal {
    // `makeSound()` metodes pārklāšana
    @Override
    void makeSound() {
        System.out.println("Vau vau!");
    }

    // Piemērs, kā izsaukt vecāku metodi
    void eat() {
        System.out.println(" suns ēd.");
        super.makeSound(); // izsauc vecāku klases metodi
    }
}

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

        myAnimal.makeSound(); // izvadīs: Dzīvnieks izdod skaņu
        myDog.makeSound();   // izvadīs: Vau vau! (pārklātais metodes realizācija)

        Dog specificDog = new Dog();
        specificDog.eat(); // izvadīs: suns ēd. 
 // Vau vau! (vecāku metodes izsaukums)
    }
}

Python piemērs:

# Vecāku klase
class Animal:
    # Metode vecāku klasē
    def make_sound(self):
        print("Dzīvnieks izdod skaņu")

# Apakšklase, kas manto no Animal
class Dog(Animal):
    # `make_sound()` metodes pārklāšana
    def make_sound(self):
        print("Vau vau!")

    # Piemērs, kā izsaukt vecāku metodi
    def eat(self):
        print(" suns ēd.")
        super().make_sound() # izsauc vecāku klases metodi

# Demonstrācija
my_animal = Animal()
my_dog = Dog() # polimorfisms

my_animal.make_sound() # izvadīs: Dzīvnieks izdod skaņu
my_dog.make_sound()   # izvadīs: Vau vau!

specific_dog = Dog()
specific_dog.eat() # izvadīs: suns ēd. 
 # Vau vau! (vecāku metodes izsaukums)