Содержимое
ООП. Наследование Праздники закончились, так что продолжим ликбез на тему ООП. В предыдущих сериях: 1. Что такое классы 2. Что такое объекты классов и как их создавать. Конструкторы 3. Что такое ООП 4. Принципы ООП: абстракция. Инкапсуляция Сегодня поговорим о таком столпе объектно-ориентированного программирования как наследование. Наследование означает, что у любого класса может быть класс-родитель. Все свойства класса родителя автоматически проявляются у класса-наследника. Возьмём пример - пользователь какого-нибудь чата, создадим для него класс BaseUser, чтобы подчеркнуть, что от этого класса будут наследоваться другие "дочерние" классы: class BaseUser { string login; string email; function send_message() { // код } } Базовый юзер - это обычный юзер, самый обобщенный вариант. У любого пользователя есть логин, email и любой пользователь может отправлять сообщения. И тут мы хотим создать не обычного пользователя, а «расширенного» - администратора. Во-первых, у него есть такие же аттрибуты и возможности, как и у базового пользователя - логин, email и он тоже может присылать сообщения. И если воспользоваться механизмом наследования, сделать AdminUser наследником BaseUser, то все эти возможности юзер-админ получает автоматически: class AdminUser(BaseUser) { } Тут мы в скобках указали, что BaseUser - это родитель AdminUser, и таким образом всё, что написано в классе BaseUser будет работать и для AdminUser. А то, что есть у AdminUser, но не у обычных пользователей, мы определим только в этом классе: class AdminUser(BaseUser) { function ban_user(user) { // код - забанить какого-нибудь пользователя } } Так админ наследует все возможности базового пользователя, и при этом имеет свои собственные возможности, которых не было у его «родителя». А еще можно переопределить метод, который админ унаследовал у родительского класса, чтобы он работал по-другому, например: class AdminUser(BaseUser) { function send_message() { // код - печатать сообщения красным цветом } } Метод send_message для админов будет печатать весь текст красным цветом. А поля и методы, которые мы решили не переопределять остались такими же, как в родительском классе. Наследование может быть многоступенчатым - например, у AdminUser тоже могут быть классы-наследники, а у них в свою очередь - свои наследники. Но такое многоуровневое наследование может необоснованно усложнять код и приводить к ошибкам. Также некоторые языки поддерживают множественное наследование - это когда один класс может иметь много родителей и наследовать все их свойства (при неразумном использовании тоже может приводить к сложностям и ошибкам). В общем, наследование - удобный инструмент для того, чтобы не дублировать лишний раз код, но не стоит злоупотреблять наследованием и использовать его там, где можно обойтись без него. В следующий раз расскажу про абстрактные классы.