Sobes.tech
Middle

Kiedy dochodzi do nadpisania metody (Overriding)?

sobes.tech AI

Odpowiedź od AI

Przesłanianie metody (Overriding) w programowaniu obiektowym zachodzi, gdy klasa pochodna ma metodę o tej samej nazwie, sygnaturze (liście parametrów) i typie zwracanym co metoda w jej klasie nadrzędnej. Pozwala to klasie pochodnej na dostarczenie własnej implementacji odziedziczonej metody.

Główne warunki przesłaniania:

  • Dziedziczenie: Klasa pochodna musi dziedziczyć po klasie nadrzędnej.
  • Sygnatura metody: Przesłaniana metoda w klasie pochodnej musi mieć tę samą sygnaturę (nazwę metody i listę typów parametrów, ich kolejność i ilość), co metoda w klasie nadrzędnej. W niektórych językach (np. Java) wymaga się również zgodności typu zwracanego lub jego kowariancji.
  • Modyfikatory dostępu: Modyfikator dostępu przesłanianej metody w klasie pochodnej nie może być bardziej restrykcyjny niż w metodzie w klasie nadrzędnej.
  • Nie można przesłaniać: Metody statyczne (static), finalne (final w Java, sealed w C#) i prywatne (private) nie uczestniczą w polimorfizmie przez dziedziczenie.

Przykład w Java:

// Klasa nadrzędna
class Animal {
    public void sound() {
        // Domyślna implementacja
        System.out.println("Animal makes a sound");
    }
}

// Klasa pochodna przesłaniająca metodę sound()
class Dog extends Animal {
    @Override // Adnotacja do sprawdzania przez kompilator
    public void sound() {
        // Specyficzna implementacja dla Dog
        System.out.println("Dog barks");
    }
}

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

        myAnimal.sound();      // Wywołuje sound() z Animal
        myDogAsAnimal.sound(); // Wywołuje przesłonięty sound() z Dog (dzięki polimorfizmowi)
        myDog.sound();         // Wywołuje przesłonięty sound() z Dog
    }
}

Przykład w Python:

# Klasa nadrzędna
class Animal:
    def sound(self):
        # Domyślna implementacja
        print("Animal makes a sound")

# Klasa pochodna przesłaniająca metodę sound()
class Dog(Animal):
    def sound(self):
        # Specyficzna implementacja dla Dog
        print("Dog barks")

# Użycie
my_animal = Animal()
my_dog_as_animal = Dog() # Polimorfizm
my_dog = Dog()

my_animal.sound()       # Wywołuje sound() z Animal
my_dog_as_animal.sound()  # Wywołuje przesłonięty sound() z Dog (dzięki polimorfizmowi)
my_dog.sound()          # Wywołuje przesłonięty sound() z Dog

Przesłanianie służy do osiągnięcia polimorfizmu w czasie wykonywania, umożliwiając wykonywanie różnych działań w zależności od rzeczywistego typu obiektu, mimo użycia odwołania do klasy nadrzędnej. Jest to kluczowa zasada programowania obiektowego do tworzenia elastycznych i rozszerzalnych systemów.