Sobes.tech
Junior

What is overriding in programming?.

sobes.tech AI

Answer from AI

Method overriding is the ability of a subclass to provide its own implementation of a method that is already defined in its parent class. The signature of the overridden method (name, number, and types of parameters) in the subclass must exactly match the signature of the method in the parent class. The return type must also be either the same or covariant (a subtype) of the parent method's return type.

Key aspects of overriding:

  • Inheritance: Overriding is only possible within the context of inheritance relationships, where a subclass inherits a method from a superclass.
  • Polymorphism: Overriding is one of the mechanisms of runtime polymorphism. It means that depending on the actual type of the object, called through a reference to the parent type, the corresponding method implementation will be executed (either from the parent or the child class).
  • @Override keyword: In some languages (e.g., Java), the @Override annotation is used. It is not mandatory for correct overriding but is recommended to improve code readability and prevent compilation errors if the method does not conform to overriding rules.
  • Access to parent method: Inside an overridden method of a subclass, it is often necessary to call the implementation of the same method from the parent class. For this, the super keyword is used (e.g., super.method()).

Example in Java:

// Parent class
class Animal {
    // Method in parent class
    void makeSound() {
        System.out.println("The animal makes a sound");
    }
}

// Child class inheriting from Animal
class Dog extends Animal {
    // Overriding makeSound()
    @Override
    void makeSound() {
        System.out.println("Woof woof!");
    }

    // Example of calling parent method
    void eat() {
        System.out.println("The dog is eating.");
        super.makeSound(); // Call method from parent class
    }
}

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

        myAnimal.makeSound(); // Outputs: The animal makes a sound
        myDog.makeSound();   // Outputs: Woof woof! (Overridden method is called)

        Dog specificDog = new Dog();
        specificDog.eat(); // Outputs: The dog is eating.
        // The animal makes a sound
    }
}

Example in Python:

# Parent class
class Animal:
    # Method in parent class
    def make_sound(self):
        print("The animal makes a sound")

# Child class inheriting from Animal
class Dog(Animal):
    # Overriding make_sound()
    def make_sound(self):
        print("Woof woof!")

    # Example of calling parent method
    def eat(self):
        print("The dog is eating.")
        super().make_sound() # Call method from parent class

# Demonstration
my_animal = Animal()
my_dog = Dog() # Polymorphism

my_animal.make_sound() # Outputs: The animal makes a sound
my_dog.make_sound()   # Outputs: Woof woof!

specific_dog = Dog()
specific_dog.eat() # Outputs: The dog is eating.
# The animal makes a sound

Overriding is used to adapt the behavior of a base class to the specifics of a subclass while maintaining a common interface. It is a key element of object-oriented design.