И полиморфизм, и наследование являются ключевыми концепциями объектно-ориентированного программирования, но служат разным целям и обеспечивают разные виды повторного использования кода.
Наследование – это механизм, позволяющий классу (подклассу или производному классу) наследовать атрибуты и методы от другого класса (суперкласса или базового класса). Это устанавливает отношение "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
Ключевые отличия:
class Dog(Animal):
, а полиморфизм – путем определения методов с одинаковыми именами в разных классах, или через duck typing.