Классы, простое наследование первое знакомство

Сначала этот сайт был блогом. Так получилось, что во время моих первых начинаний мне помогло написание пустой программы. Программа ничего не делала, но компилировалась и запускалась. Пойдём тем же путём: напишем пустую программу, но задействуем механизм наследования. Минимум кода позволит достаточно быстро увидеть основные моменты.
Смотрим код:

В приведённом коде создано два класса. Поскольку сами по себе классы пустые идеи, я посчитал нужным объявить объекты. В листинге #1 каждый объект соответствует своему классу и является воплощением идеи во что-то реально существующее. Дальше объявлена главная функция программы. .
  • Наследованием называется создание подкласса на основе уже существующего.
Для понимания темы нужно знать:

Незнание любого из этих материалов может привести только к потраченному зря времени.

Смотрим код:

В приведенном коде описывается базовый класс A, на основе этого класса описывается второй класс: класс B. Класс A выступает в роли фундамента и передает все свои тайны своему наследнику.
Внутри класса A объявлен один скрытый элемент x. Элемент x сокрыт классом от внешнего для класса миром секцией класс private:

Приватная секция у классов работает по умолчанию, поэтому обозначать секцию явно не обязательно, она и не обозначена.

Чтобы достучаться до сокрытой классом части класса, нужно использовать посредника, открытого классом внешнему миру. В роли такого посредника выступит метод get_x(int) из класса A. Для работы с защищённой от внешнего мира переменной класса x используется функции-посредник: она вытаскивает значение. Сейчас значение выводится на экран.

После того как основной класс, класс A, был описан, использовался приём наследования. Второй класс, класс B, объявлен немного не так как основной. Точнее, объявлен-то он как и обычно классы объявляются, но B был обозначен как потомок класса A. Когда указываем потомка, надо обозначать доступ потомка. Но с этим вы познакомитесь позднее. В данном случае выбран доступ public.

Несмотря на то, что класс B выглядит как пустой класс, им были унаследованы умения класса A.

  • Потомки наследуют от родителя всё

Несмотря на то, что наследует потомок всё родительское, частично унаследованное мы использовать не можем. Тем не менее, родительский класс делится всем.
Поскольку класс B получил себе всё от родительского себе класса A, то то, что было открыто классом A для внешнего использования, объявленные объекты с типом класса, являющегося потомком, могут использовать. Смысл наследования в том, что "Потомок" = "Родитель+"; В потомке есть всё, что есть у родителя, но у родителя не всё, что есть у потомка. Т. е. развитие потомка на родителя не влияет. Родитель щедро делится всем, потомку нужно только наследство (классика жанра).

Этот код очень похож на предыдущий (на листинг #2), но внутри наследника дописана одна функция. Для наглядности написана она непосредственно внутри своего класса. Чтобы обращаться к этой функции напрямую, она описана в секции public.

  • Внутри потомка можно создать одноимённую функцию с функцией из класса родителя, в таком случае происходит что-то вроде отказа от этой части наследства и такая функция становится самостоятельной функцией своего класса.

Думаю, это можно не демонстрировать, вы сами сможете легко посмотреть поведение программы в такой ситуации.

Добавленная в наследника функция всего-лишь выводит на экран текст: "Hello", она получила себе своё уникальное название. Этот момент предназначен только для демонстрации того, что всё, что справедливо для класса A, стало справедливым для класса B, но не всё, что справедливо для класса B справедливо для класса A.
Забежим немного вперёд. В литинге #1 был описан пустой класс B, но несмотря на то, что я написал: "Он унаследовал все элементы из класса A", об абсолютно полном унаследовании элементов классами говорить в корне неправильно. На самом деле во время первого обращения к каждому из объектов произошел неявный вызов конструкторов. Для каждого объекта вызывается исключительно свой конструктор и этот элемент никогда не наследуется.

Так как конструкторы, создаваемые по умолчанию, одинаковые, то в описанном случае верно высказывание: "класс А равен классу B", но при этом неверно "класс B унаследовал всё из класса A (имеется в виду листинг #1, где в классе B пусто).

Подводим итоги:

  • Наследование — создание подкласса на основе уже существующего
  • Класс, от которого произошло наследование, называется базовым или родителем.
  • Класс, который произошел от родителя, называется производным классом или потомком.
  • Наследование похоже на доведение чего-то готового до ума через добавление дополнительной функциональности.
  • Конструкция наследования:

  • При использовании наследования свойства и функциональность родительского класса заимствуются классом-потомком.
  • В случае, если в класс потомок добавлены какие-то элементы, то класс-потомок не делится этим с родителем.
  • При использовании в методах класса-потомка одноимённого метода с методом класса-родителя происходит что-то вроде отказа от этой части наследования и такой метод воспринимается классом-потомком как самостоятельный и свой собственный метод.
  • Несмотря на то, что класс потомок может быть равен классу-родителю, нет и не может быть такого случая, когда можно сказать, что класс-потомок унаследовал абсолютно всё от класса родителя (прим. В контексте этого вывода: для работы с классом обязателен объект).

3 комментария на «“Классы, простое наследование первое знакомство”»

  1. Anonymous:

    Спасибо, все очень понятно!

  2. Сергей:

    Конструкция наследования class ИмяКлассаРодителя: метод доступа ИмяКлассаПотомка {методы потомка};
    Может наоборот?
    Конструкция наследования class ИмяКлассаПотомка: метод доступа ИмяКлассаРодителя {методы потомка};

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Поиск

 
     

Случайная книга в электронном формате

https://www.litres.ru/igor-simdyanov/php-na-primerah-4578521/?lfrom=15589587
Яндекс.Метрика