Добавить в корзинуПозвонить
Найти в Дзене
Programmer

Основы программирования. Наследование, интерфейсы, абстрактные классы в виде коробок с дырками от методов!

В данной статье для вас поясню революционную информацию, позволяющую вам полностью понять "под капотом" весь мир наследования от базовых классов до реализации интерфейсов и абстрактных классов. И да, этого вам в мире никто снова не расскажет! Картинки для вас буду делать в telegra.ph по технической причине, буду здесь оставлять ссылки на картинки. Итак, начнем... Весь мир наследования и интерфейсов основывается на коробках с отверстиями для переопределяющихся (override) или "виртуальных" (virtual, abstract) методов, этими коробками обычно являются ссылки на интерфейсы, на базовые или абстрактные классы, но в С++ (и в C#) те же самые коробки могут быть указателями, так как указатель и ссылка едины по природе. Коробки всегда содержат какую-то часть объекта или максимум целый объект внутри Почему в мире наследования чаще применяются коробки-ссылки? По многим причинам, но главной из них является фантастическая возможность с помощью коробок с отверстиями от методов запихивать в любую короб
Оглавление

В данной статье для вас поясню революционную информацию, позволяющую вам полностью понять "под капотом" весь мир наследования от базовых классов до реализации интерфейсов и абстрактных классов. И да, этого вам в мире никто снова не расскажет! Картинки для вас буду делать в telegra.ph по технической причине, буду здесь оставлять ссылки на картинки.

Итак, начнем... Весь мир наследования и интерфейсов основывается на коробках с отверстиями для переопределяющихся (override) или "виртуальных" (virtual, abstract) методов, этими коробками обычно являются ссылки на интерфейсы, на базовые или абстрактные классы, но в С++ (и в C#) те же самые коробки могут быть указателями, так как указатель и ссылка едины по природе.

Коробки всегда содержат какую-то часть объекта или максимум целый объект внутри

Почему в мире наследования чаще применяются коробки-ссылки? По многим причинам, но главной из них является фантастическая возможность с помощью коробок с отверстиями от методов запихивать в любую коробку любую логику у переопределяющихся виртуальных методов в месте данного отверстия коробки объекта. А кроме этого, коробки могут содержать любую часть объекта, но не могут выходить за пределы внутреннего содержащегося объекта.

Отверстия в коробках для виртуальных методов я также буду иногда называть коробками методов в коробках объектов! То есть это коробки в коробках от объектов.

Так как интерфейсы и абстрактные классы содержат пустые коробки-отверстия от методов и поэтому нельзя из них создавать объекты по причине неполноценности этих чертежей, то интерфейсами и абстрактными классами всегда оперируют только с помощью коробок (ссылок и указателей), запомните это на всю жизнь. Большие объекты запихиваются в разного рода малые коробки с отверстиями от виртуальных методов, то есть охват тела коробки с отверстиями методов всегда находится внутри объекта. Это главное качество виртуальных коробок - все коробки могут содержать любую часть объекта, то есть охват коробки не может заходить за границы содержащегося в ней объекта, а может быть только меньше объекта!

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

В коробку-метод внутри коробки-ссылки при наследовании всегда попадает виртуальный метод текущего объекта, часть которого находится в данной ссылке!!!

И запомните главное! Коробка виртуального метода внутри коробки-ссылки от объекта никак не привязана к самим методам и их логике, то есть в данное отверстие может попасть любой метод, который соответствует данной сигнатуре (набор типов параметров), но при вызове этих методов из коробок вызываются всегда именно те методы, которые в данный момент находятся в отверстии метода и принадлежат именно текущему объекту в ссылке. Понятно? То есть коробки-ссылки содержат части объектов и могут обращаться через коробки-методы только к текущим своим содержащимся объектам, то есть вызывать виртуальный метод только текущего объекта в коробке!

В этом и заключается смысл переопределения виртуальных методов при наследовании и реализации интерфейсов и абстрактных классов, то есть все переопределяющиеся методы всегда принадлежат к текущему объекту и засовываются в коробки-методы внутри коробок-ссылок, то есть коробка-метод всегда получает тот виртуальный метод именно текущего объекта в ссылке интерфейса, абстрактного или базового класса! Запомните навсегда!

Ссылки интерфейсов, абстрактных и базовых классов - это маски, наложенные на объекты, с прорезями для виртуальных методов!

Еще ссылки из мира наследования от интерфейсов, абстрактных классов, наследуемых или наследующих классов идеально можно сравнить с маской на лице с прорезями для глаз, рта и носа. Маской является ссылка или указатель (виртуальная коробка), которая охватывает свою часть объекта (голову человека под маской), при этом в прорезях маски (коробки-ссылки) находятся нос, глаза и рот, которые в наследующих и наследуемых классах или интерфейсах являются виртуальными (переопределяющимися) методами-функциями текущего объекта (каждый новый человек в маске засунет свои нос, рот и глаза).

Вот! Вроде лучшего объяснения мира наследования и ссылок и указателей на части объектов не придумать. Запомните выше данное определение наследования и коробок (ссылок-указателей) от разных частей объектов на всю жизнь! Это на данный момент у меня лучшее объяснение. Его вам до этого точно никто в мире не говорил, а точнее о наследовании и коробках частей объектов и не скажешь...

Виртуальная коробка (ссылка, указатель) может содержать абсолютно любую часть объекта, но границы коробки всегда ограничиваются внешней границей содержащегося объекта, данные коробки могут вызывать любые виртуальные методы текущих объектов, попадающие в прорези для методов внутри коробки. Коробка не может вызывать методы из других частей текущего объекта, которых коробка не охватывает, в том числе из прорезей методов данного объекта за пределами коробки. А обычные невиртуальные методы (попадающие в коробку из своей части объекта) также спокойно вызываются как коробками базовых объектов, так и наследующих, так как обычные неприватные методы являются частью наследуемых и наследующих объектов и им не требуются прорези в коробках, так как они не переопределяются (запечатаны или sealed), а копируются при наследовании.

Невиртуальные обычные методы при наследовании копируются и не имеют коробок-методов внутри ссылок в месте метода, они аналогичны методам sealed

Все обычные методы базовых или абстрактных классов при наследовании (у интерфейсов все методы "чисто виртуальные" и пустые) полностью аналогичны "запечатанным" методам с модификаторами sealed, то есть они просто копируются в наследующий класс вниз по иерархии, их нельзя переопределить, а на их месте отсутствуют прорези для коробок-методов у ссылок-коробок объектов наследования. Это значит, что такие методы не обязаны находиться в месте прорези внутри ссылки (они невиртуальные) и не обязаны содержать одинаковую сигнатуру (набор типов параметров) для переопределения в наследующем из наследуемого типа объекта.

Смысл здесь в том, что обычные методы копируются вниз по наследованию и не имеют прорезей в коробках в одинаковых местах расположения методов объектов при наследовании, так как такие методы не подлежат ни реализации из пустых (наследование интерфейсов и абстрактных классов), ни переопределению (наследование абстрактных или базовых классов).

При наследовании вниз могут появиться расширяющие компоненты или методы

Кроме "виртуальных" методов с прорезями у коробок в их местах и обычных "невиртуальных" копирующихся методов, при наследовании у наследующего класса внизу по иерархии могут появиться расширяющие методы или переменные, то есть это компоненты наследующего класса или типа, о которых ничего не знают предки или наследуемые классы и интерфейсы.

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

О наследовании мне вам еще есть очень много рассказать чего, но данная статья и так уже большой получилась, отдельно вам расскажу о фантастическом множественном наследовании в трех его типах. Смотрите картинки в Телеграфе, которые я вам постараюсь сейчас сделать к статье, они идеально вам показывают на реальном примере жизни, что такое волшебный мир наследования. А если к нему добавить волшебный мир женериков (обобщений), то можно творить великие чудеса, но это в отдельной статье...

Ставьте лайки и подписывайтесь, комментируйте, пока...

Все рисунки и картинки к статье смотрите отдельно на моем канале в рубрике картинок к статьям, то есть теперь я все картинки к большим главам-статьям данной книги буду публиковать отдельно в Telegraph и Дзен с комментариями к каждой картинке!