Чем полиморфизм отличается от наследования?

Наследование позволяет создать новый класс на основе существующего (родительского), наследуя его атрибуты и методы. Отношения "является" (is-a).

Полиморфизм означает, что один и тот же метод может вести себя по-разному в разных классах. Отношения "ведет себя как" (behaves-like). Реализуется через переопределение методов в дочерних классах.

И полиморфизм, и наследование являются ключевыми концепциями объектно-ориентированного программирования, но служат разным целям и обеспечивают разные виды повторного использования кода.

Наследование – это механизм, позволяющий классу (подклассу или производному классу) наследовать атрибуты и методы от другого класса (суперкласса или базового класса). Это устанавливает отношение "is-a". Подкласс получает все возможности базового класса, и может расширять или изменять их. Наследование обеспечивает иерархическую структуру классов и позволяет избежать повторения кода за счет переиспользования общих атрибутов и методов.

Пример наследования (Python):

        
class Animal:
    def speak(self):
        print("Generic animal sound")

class Dog(Animal):
    def speak(self):
        print("Woof!")

class Cat(Animal):
    def speak(self):
        print("Meow!")

my_dog = Dog()
my_dog.speak()  # Output: Woof!

my_cat = Cat()
my_cat.speak()  # Output: Meow!

animal = Animal()
animal.speak() # Output: Generic animal sound
        
    

Полиморфизм (в переводе с греческого – «много форм») – это способность объектов разных классов реагировать на один и тот же метод (или операцию) по-разному. Это позволяет писать код, который может работать с объектами разных классов единообразно, не заботясь о их конкретном типе. Существуют разные виды полиморфизма, включая полиморфизм подтипов (наследование) и параметрический полиморфизм (обобщенное программирование).

Пример полиморфизма (Python):

        
class Animal:
    def speak(self):
        print("Generic animal sound")

class Dog(Animal):
    def speak(self):
        print("Woof!")

class Cat(Animal):
    def speak(self):
        print("Meow!")

def animal_sound(animal):  # Функция, работающая с любым Animal
    animal.speak()

my_dog = Dog()
my_cat = Cat()

animal_sound(my_dog)  # Output: Woof!
animal_sound(my_cat)  # Output: Meow!

animal = Animal()
animal_sound(animal) # Output: Generic animal sound
        
    

Ключевые отличия:

  • Назначение: Наследование предназначено для установления иерархии классов и повторного использования кода, а полиморфизм – для написания гибкого кода, работающего с объектами разных классов единообразно.
  • Отношение: Наследование определяет отношение "is-a" между классами, а полиморфизм позволяет объектам разных классов реагировать на один и тот же метод по-разному.
  • Реализация: Наследование реализуется с помощью ключевого слова class Dog(Animal):, а полиморфизм – путем определения методов с одинаковыми именами в разных классах, или через duck typing.
  • Использование: Наследование используется, когда нужно создать новый класс на основе существующего и переиспользовать его функциональность. Полиморфизм используется, когда нужно работать с разными типами объектов единообразно.
0