Найти в Дзене
JavaKruzh

Зачем нужно наследование в ООП?

Наследование в объектно-ориентированном программировании позволяет создавать иерархии классов, где дочерние классы могут наследовать свойства и методы родительских классов. Это способствует повторному использованию кода, уменьшает дублирование и обеспечивает более логическую иерархию классов. Например, мы программируем персонажей из РПГ игры. Каждый персонаж будет иметь свое здоровье и защиту (атрибуты) и уметь проводить контратаку (метод). Но маги умеют еще колдовать и им нужно добавить атрибут маны, охотники стрелять - им нужно указать количество стрел, а рыцари атаковать - добавить параметр прочности клинка. Если мы напишем отдельно классы колдуна охотника и рыцаря, то получим дублирование кода. В каждом классе придется прописать здоровье и защиту и функцию контратаки: Для того, чтобы этого избежать можно создать суперкласс (класс-родитель), например, класс Person в нем указать атрибуты здоровья и защиты, а также добавить метод контратаки: Теперь мы можем сделать классы Knight, Wiza

Наследование в объектно-ориентированном программировании позволяет создавать иерархии классов, где дочерние классы могут наследовать свойства и методы родительских классов. Это способствует повторному использованию кода, уменьшает дублирование и обеспечивает более логическую иерархию классов.

Например, мы программируем персонажей из РПГ игры. Каждый персонаж будет иметь свое здоровье и защиту (атрибуты) и уметь проводить контратаку (метод). Но маги умеют еще колдовать и им нужно добавить атрибут маны, охотники стрелять - им нужно указать количество стрел, а рыцари атаковать - добавить параметр прочности клинка.

Охотник маг и рыцарь
Охотник маг и рыцарь

Если мы напишем отдельно классы колдуна охотника и рыцаря, то получим дублирование кода. В каждом классе придется прописать здоровье и защиту и функцию контратаки:

Для того, чтобы этого избежать можно создать суперкласс (класс-родитель), например, класс Person в нем указать атрибуты здоровья и защиты, а также добавить метод контратаки:

Класс Person с общими атрибутами здоровья, защиты и общим методом совершения контратаки
Класс Person с общими атрибутами здоровья, защиты и общим методом совершения контратаки

Теперь мы можем сделать классы Knight, Wizard и Hunter наследниками родительского класса Person через ключевое слово extends (наследует):

В итоге мы избавляемся от дублирования, а код для каждого персонажа стал меньше. Теперь, если нам нужно будет изменить что-то общее для наших классов, нам не надо будет поправлять это в каждом месте.

Конечно, в данном примере может показаться, что ничего особо и не изменилось и 10 сэкономленных в каждом классе строк компенсируется одним целым новым классом Person. Но в реальной практике программирования классы могут иметь десятки и сотни наследников, каждый из которых имеет множество атрибутов и методов. Поэтому учимся красиво программировать в стиле ООП с малого, доводя до автоматизма, чтобы затем, на реальных проектах, не получать огромные куски одного и того же кода и не бегать по всем классам, поправляя одно и то же.

П.С.: можно заметить, что класс Person вряд ли будет иметь свои экземпляры, поэтому его можно сделать абстрактным.

Если остались какие-то вопросы или что-то нужно разобрать подробнее, буду признателен комментарию, постараюсь дописать и привести примеры)