30-01-2019 11:00

ООП, объекты, классы. Наследование и интерфейсы

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

Объектный подход

How dangerous is the new coronavirus?You will be interested:How dangerous is the new coronavirus?

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

  • Инкапсуляция.
  • Наследование.
  • Полиморфизм.
  • Наследование.

Наследование

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

Понятие наследования

Для того, чтобы понять суть процесса наследования, можно привести пример из жизни. Существует абстрактное понятие «человек». У любого человека есть общие характеристики, которыми его можно описать. Это рост, вес, цвет волос, тембр голоса, и так далее. Иванов Иван, ученик 1 «А» класса — это конкретный представитель понятия «человек», то есть, выражаясь языком объектно-ориентированного подхода, понятие Иванов Иван — наследник понятия человек. Или, к примеру, соседский кот Барсик — наследник понятия «кот». Можно составить более сложное наследование: понятие Барсик наследуется от понятия мейн-кун, которое в свою очередь наследуется от понятия «кот».

Как это описывается языком программирования?

В разработке программного обеспечения процесс наследования дает возможность создавать класс на основе других. Класс-родитель называется базовым, а остальные-наследники — это производные. Заимствование заключается в в том, что потомкам переходят методы, свойства и поля родителей. Синтаксис наследования классов в языке программирования C# может выглядеть следующим образом. Например:

class Ivan : Person { // тело класса {

Пример механизма наследования классов:

class Person { public int Age { get; set; } } class Ivan : Person { public void Talk() { // Иван разговаривает } } class Peter : Person { public void Walk() { // Петр идет } } class Program { static void Main(string[] args) { Ivan ivan = new Ivan(); ivan.Age = 29; // обозначаем возраст Peter peter = new Peter(); peter.Age = 35 ivan.Talk(); peter.Walk()(); } }

На основе базового класса Person создаются классы-наследники, и свойство Age доступно для обоих классов.

Конструктор базового класса

Создавая класс с объявленным конструктором и класс-наследник, возникает логичный вопрос: какие конструкторы за что будут отвечать при создании объектов этих классов?

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

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

public Ivan (int age) : base (age) { //тело конструктора }

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

Доступ к полям из дочернего класса

Наследование доступа к свойствам и методам базового класса из класса-наследника становится возможным, если все они объявляются со следующими ключевыми словами:

1. Public.

Предоставляет неограниченный доступ к членам класса: из Main, из классов-наследников, из других аналогов.

2. Protected.

Доступ к члену остается только из исходного класса, или из производных аналогов.

3. Internal.

Ограничение к члену локализовано только данной сборкой проекта.

4. Protected internal.

Ограничение к члену лимитировано только данной сборкой проекта или из производных классов.

Модификаторы доступа

Наследование доступа к членам класса зависит от ключевых слов. Если при объявлении члена как таковое не указано, то доступность устанавливается по умолчанию (private).

Множественное наследование

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

Примеры интерфейсов

Данные структуры создаются за пределами классов, объявляются, используя ключевое слово interface:

interface IMyInterfave { void MyMethod (int someVar); }

Правило хорошего тона при создании интерфейсов — начинать имя конструкции с заглавной буквы I, чтобы в дальнейшем их легко было различать. В теле интерфейса объявляются сигнатуры его членов.

Для указания того, что класс будет реализовывать интерфейс, необходимо так же, как и при обычно наследовании, указать имя конструкции после объявления класса:

class MyClass : IMyInterface { public void MyMethod (int someVar) }

Интерфейсы необходимы для того, чтобы реализовывать множественное наследование. В языке программирования С++, ножественное наследование классов возможно; в языке C# для этих целей используются интерфейсы. Класс может реализовывать многочисленное количество интерфейсов, в таком случае они перечисляются через запятую после объявления класса:

class MyClass : IMyFirstInterface, IMySecondInterface { //тело класса }

По умолчанию все свойства и методы интерфейсов имеют доступ public, потому что должны определять некий функционал, который в дальнейшем будет реализован в классе. Наследование в C# почти всегда включает в себя использование этого удобного инструмента.

Двоичный код

Еще немного о наследовании классов

Java, С#, С++ - все объектно-ориентированные языки по-своему реализуют механизм наследования. Но суть везде одна: передать свойства родителя объекту-потомку. Интерфейсы, абстрактные классы - это все удобные инструменты для воплощения этой задачи.



Источник