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 (finalw Java,sealedw 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.