Sobes.tech
Middle

Kad notiek metodes pārrakstīšana (Overriding)?

sobes.tech AI

Atbilde no AI

Metodes pārrakstīšana (Overriding) objektorientētajā programmēšanā notiek, kad apakšklasei ir metode ar tādu pašu nosaukumu, parametru sarakstu (vai signatūru) un atgriešanas tipu kā tās vecākajā klasē. Tas ļauj apakšklasei sniegt savu īstenojumu mantojamai metodei.

Galvenie nosacījumi pārrakstīšanai:

  • Mantošana: Apakšklasei jābūt mantojumam no vecākās klases.
  • Metodes signatūra: Pārrakstītajai metodei apakšklasē jābūt tādai pašai signatūrai (metodes nosaukums un parametru tipu saraksts, to kārtība un skaits), kā vecākās klases metodē. Dažās valodās (piemēram, Java) ir nepieciešama arī atgriešanas tipa saskaņošana vai kovariantība.
  • Piekļuves modifikatori: Pārrakstītās metodes piekļuves modifikators apakšklasē nedrīkst būt stingrāks nekā vecākās klases metodē.
  • Nav iespējams pārrakstīt: Statiskās (static), galīgās (final Java, sealed C#) un privātās (private) metodes, jo tās nepiedalās polimorfismā caur mantošanu.

Piemērs Java:

// Vecākās klases
class Animal {
    public void sound() {
        // Noklusējuma īstenojums
        System.out.println("Dzīvnieks izdala skaņu");
    }
}

// Apakšklase, kas pārraksta metodi sound()
class Dog extends Animal {
    @Override // Anotācija pārbaudei kompilatorā
    public void sound() {
        // Īpašs īstenojums Dog
        System.out.println(" suns rej");
    }
}

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

        myAnimal.sound();      // Izsauc sound() no Animal
        myDogAsAnimal.sound(); // Izsauc pārrakstīto sound() no Dog (pateicoties polimorfismam)
        myDog.sound();         // Izsauc pārrakstīto sound() no Dog
    }
}

Piemērs Python:

# Vecākās klases
class Animal:
    def sound(self):
        # Noklusējuma īstenojums
        print("Dzīvnieks izdala skaņu")

# Apakšklase, kas pārraksta metodi sound()
class Dog(Animal):
    def sound(self):
        # Īpašs īstenojums Dog
        print(" suns rej")

# Lietošana
my_animal = Animal()
my_dog_as_animal = Dog() # Polimorfisms
my_dog = Dog()

my_animal.sound()       # Izsauc sound() no Animal
my_dog_as_animal.sound(); # Izsauc pārrakstīto sound() no Dog (pateicoties polimorfismam)
my_dog.sound();          # Izsauc pārrakstīto sound() no Dog

Pārrakstīšana tiek izmantota, lai sasniegtu izpildes laikā polimorfismu, ļaujot veikt dažādas darbības atkarībā no objekta faktiskā tipa, neskatoties uz to, ka izmantojam atsauci uz vecāku klasi. Šis ir galvenais OOP princips, lai veidotu elastīgas un paplašināmas sistēmas.