Я хотел бы иметь богатого дядю, но, к сожалению, мы не говорим о таком наследстве.
Однако мы говорим о семье.
В частности, о наследовании говорят в терминах родительских классов и дочерних классов.
Родительские классы
Как один класс может быть родителем другого? Не похоже, что наши классы рожают детей. На самом деле, некоторые люди предпочитают называть их «супер» классами, и лично я думаю, что в этом больше смысла.
Итак, если класс состоит из общих свойств и моделей поведения других объектов (или экземпляров), то чем, по-вашему, должен быть суперкласс?
Именно, он обладает свойствами, общими для других классов!
Когда мы говорим «супер» или «родитель», на самом деле мы говорим «более общий».
Все квадраты — прямоугольники
Давайте рассмотрим пример, с которым вы наверняка знакомы. Я уверен, что вы помните из геометрии, что такое прямоугольник и квадрат.
Вы также наверняка помните, что все квадраты также являются прямоугольниками, но все прямоугольники не обязательно являются квадратами. Квадрат обладает всеми свойствами прямоугольника (4 стороны, 4 прямых угла), но у него есть и дополнительные свойства (все стороны равной длины).
Если мы создадим класс для прямоугольников:
class Rectangle
@sides = 4
@all_right_angles = true
end
и квадратов:
class Square
@sides = 4
@all_right_angles = true
@all_sides_equal = true
end
мы увидим, что все, что есть в классе прямоугольников, есть и в классе квадратов.
Поскольку суть класса заключается в том, чтобы быть более абстрактным и более общим, более общий класс является «супер» классом. В данном случае прямоугольник является супер- или родительским классом. Класс квадрата будет считаться подклассом или дочерним классом.
Классы-родители и другие отношения
Прямоугольник является родителем квадрата, потому что квадрат обладает всеми свойствами и поведением прямоугольника.
Но разве все прямоугольники не являются параллелограммами? (Если вы забыли геометрию, то ответ — да).
А разве все параллелограммы не являются также четырехугольниками? А разве все четырехугольники не являются также многоугольниками? И разве не все… Вы поняли идею.
Подобно родителям ваших родителей, мы можем назвать эти классы классами бабушек и дедушек. Дальнейшие отношения можно рассматривать как классы-дедушки или классы-предки, но это не очень распространено.
** Квадрат < Прямоугольник < Параллелограмм < Четырехугольник < Многоугольник **.
Существуют также классы-«братья и сестры», которые имеют одного родителя, но в остальном не связаны между собой.
Например, класс ромба будет родным братом класса прямоугольника, потому что они оба являются дочерними классами класса параллелограмма!
Наследование в коде
Теперь, когда мы разобрались в этой концепции, давайте посмотрим, что она означает для нашего кода.
Посмотрите на наши предыдущие классы квадрата и прямоугольника:
class Rectangle
@sides = 4
@all_right_angles = true
end
class Square
@sides = 4
@all_right_angles = true
@all_sides_equal = true
end
Поскольку квадраты обладают всеми свойствами и поведением прямоугольников, мы можем установить наш класс квадратов как дочерний или подкласс прямоугольников. В ruby мы делаем это с помощью ‘<‘ в объявлении класса.
class Rectangle
@sides = 4
@all_right_angles = true
end
class Square < Rectangle
@all_sides_equal = true
end
Теперь класс square будет *наследовать* все, что есть в классе rectangle, и нам не придется набирать все это снова!