Основные принципы ооп: инкапсуляция, наследование, полиморфизм
Содержание:
Плюсы и минусы объектно-ориентированных языков программирования
Хотя языки ООП могут быть мощными, они полезны не для каждой ситуации и имеют некоторый багаж, который необходимо учитывать.
Плюсы
1. Возможность повторного использования
Объектно-ориентированный код имеет чрезвычайно модульную структуру. Благодаря полиморфизму и абстракции вы можете создать одну функцию, которую можно будет использовать снова и снова. Вы также можете скопировать информацию и функции, которые уже были написаны с помощью наследования. Это экономит время, снижает сложность, экономит место и упрощает программирование.
2. Параллельная разработка
Существует достаточно наработок для того, чтобы части программы разрабатывались отдельно друг от друга и при этом функционировали по объектно-ориентированным принципам. Это значительно упрощает параллельную разработку для более крупных команд разработчиков.
3. Обслуживание
Поскольку большая часть, если не весь, наш код находится в одном месте, вызывается и используется повторно, этот код намного проще поддерживать. Вместо того, чтобы по отдельности исправлять сотню различных случаев вызова функции, мы можем исправить одну модульную и полиморфную функцию.
4. Безопасность
Хотя большинство языков имеют некоторую безопасность, объектно-ориентированные языки удобны, поскольку безопасность встроена с инкапсуляцией. Другие методы и классы не могут получить доступ к личным данным по умолчанию, и программы, написанные на языках ООП, более безопасны для этого.
5. Модульность
В объектно-ориентированных языках программирования приложение разбивается на объекты и классы. Это полезно, потому что даёт вашему приложению более модульную структуру. Модульный код легче читать. Поэтому его легче обслуживать.
Минусы
1. Часто грязный
Поскольку объектно-ориентированные языки настолько настраиваемы и масштабируемы, можно легко потерять понимание того, как работает код. Код ООП может работать разными способами. Существует множество методологий программирования в ООП, которые не работают с другими методологиями, неэффективны или сложны в использовании.
2. Требуется больше планирования
Поскольку эти языки настолько модульны и масштабируемы, отказ от чёткой конструкции заранее — это рецепт катастрофы. Создание эффективной программы требует твёрдого плана в большей степени, чем при использовании других парадигм программирования.
3. Непрозрачность
Это как плюс, так и минус. Объекты и функции могут работать независимо. Они могут получать информацию и (обычно) возвращать надёжные результаты. В результате они могут оказаться чёрными ящиками, а это означает, что то, что они делают, не всегда очевидно. Хотя программист, вероятно, создал этот объект и знает, что он делает, языки ООП просто не так прозрачны, как другие языки.
4. Производительность
Объектно-ориентированные языки часто страдают от снижения производительности. Программы, написанные на языках ООП, часто больше и требуют больше вычислительных усилий для запуска, чем функциональные языки
Однако это не всегда так или важно. C ++ — язык ООП, но это один из самых быстрых доступных языков
В то же время скорость не всегда важна. Разница в скорости становится очевидной только при обработке огромных или сложных вычислений, или в случаях, когда требуется экстремальная скорость.
Наследование[]
Наследование — один из четырёх важнейших механизмов объектно-ориентированного программирования (наряду с инкапсуляцией, полиморфизмом и абстракцией), позволяющий описать новый класс на основе уже существующего (родительского), при этом свойства и функциональность родительского класса заимствуются новым классом.
Другими словами, класс-наследник реализует спецификацию уже существующего класса (базовый класс). Это позволяет обращаться с объектами класса-наследника точно так же, как с объектами базового класса.
Простое наследование:
Класс, от которого произошло наследование, называется базовым или родительским (англ. base class). Классы, которые произошли от базового, называются потомками, наследниками или производными классами (англ. derived class).
В некоторых языках используются абстрактные классы. Абстрактный класс — это класс, содержащий хотя бы один абстрактный метод, он описан в программе, имеет поля, методы и не может использоваться для непосредственного создания объекта. То есть от абстрактного класса можно только наследовать. Объекты создаются только на основе производных классов, наследованных от абстрактного. Например, абстрактным классом может быть базовый класс «сотрудник вуза», от которого наследуются классы «аспирант», «профессор» и т. д. Так как производные классы имеют общие поля и функции (например, поле «год рождения»), то эти члены класса могут быть описаны в базовом классе. В программе создаются объекты на основе классов «аспирант», «профессор», но нет смысла создавать объект на основе класса «сотрудник вуза».
Множественное наследование
При множественном наследовании у класса может быть более одного предка. В этом случае класс наследует методы всех предков. Достоинства такого подхода в большей гибкости. Множественное наследование реализовано в C++. Из других языков, предоставляющих эту возможность, можно отметить Python и Эйфель. Множественное наследование поддерживается в языке UML.
Множественное наследование — потенциальный источник ошибок, которые могут возникнуть из-за наличия одинаковых имен методов в предках. В языках, которые позиционируются как наследники C++ (Java, C# и др.), от множественного наследования было решено отказаться в пользу интерфейсов. Практически всегда можно обойтись без использования данного механизма. Однако, если такая необходимость все-таки возникла, то, для разрешения конфликтов использования наследованных методов с одинаковыми именами, возможно, например, применить операцию расширения видимости — «::» — для вызова конкретного метода конкретного родителя.
Попытка решения проблемы наличия одинаковых имен методов в предках была предпринята в языке Эйфель, в котором при описании нового класса необходимо явно указывать импортируемые члены каждого из наследуемых классов и их именование в дочернем классе.
Большинство современных объектно-ориентированных языков программирования (C#, Java, Delphi и др.) поддерживают возможность одновременно наследоваться от класса-предка и реализовать методы нескольких интерфейсов одним и тем же классом. Этот механизм позволяет во многом заменить множественное наследование — методы интерфейсов необходимо переопределять явно, что исключает ошибки при наследовании функциональности одинаковых методов различных классов-предков.
Абстракция, объект, класс, модули, иерархия, интерфейс, методы
Объекты могут быть абстрактными сущностями в программе, а могут олицетворять объекты физической среды. Бизнес-процессы тоже можно представить как взаимодействие и состояния объектов. Вы можете проводить разные аналогии с физическим и бизнесовым миром для тренировки объектного мышления. Можно встретить такие аналогии, как производство, устройство и вождение автомобиля, устройство города или дома и др. В мире мы повсюду видим классы объектов, и объекты как-то взаимодействуют в иерархии.
Абстрагировать – это выделить значимые характеристики объектов, и в ООП важно выделить их правильно. Класс – это описание объектов, представителей класса: отличительные признаки, состояния, взаимодействия
Что это, из чего это состоит, что можно с этим делать и как именно? У классов и объектов есть атрибуты, данные (Data) и методы, то есть функции для управления данными
Класс – это описание объектов, представителей класса: отличительные признаки, состояния, взаимодействия. Что это, из чего это состоит, что можно с этим делать и как именно? У классов и объектов есть атрибуты, данные (Data) и методы, то есть функции для управления данными.
Намереваясь решить какую-то задачу, программист строит из модулей абстрактных объектов архитектуру исходного кода, в которой есть иерархия.
Иерархия: модули классов; базовый класс (класс описывает свойства объектов, содержит множество объектов, подклассов), производный класс (наследует свойства родительского класса и тоже содержит объекты); отдельно взятый объект (данные/Data, описывающие свойства объекта, + методы, то есть функции для работы с объектом, алгоритмы управления, действия, которые выполняет объект).
Методами в ООП называют функции для работы с объектами (что и как с этим делать, как и с чем это взаимодействует). Методы могут быть доступны другим классам и управлять их действиями, а могут быть действительны только внутри класса.
Совокупность тех методов класса, которые доступны и другим классам, называются интерфейсом. Чтобы тренировать объектное мышление, можно проводить аналогии с работой физических объектов и систем (с приборной доской в самолете, с пультом управления, с домофоном или лифтом в многоквартирном доме). Методы могут быть публичными и инкапсулированными, то есть скрытыми. По аналогии: панель управления в машине – на виду (интерфейс класса), а детали под капотом работают скрыто (так называемый «черный ящик»).
История
Объектное и объектно-ориентированное программирование (ООП) возникло
в результате развития идеологии процедурного программирования,
где данные и подпрограммы (процедуры, функции) их обработки формально
не связаны. Кроме того, в современном объектно-ориентированном
программировании часто большое значение имеют понятия события (так
называемое событийно-ориентированное
программирование) и компонента (компонентное
программирование).
Первым языком программирования, в котором были предложены принципы
объектной ориентированности, была Симула. В момент своего появления (в 1967 году), этот язык программирования
предложил поистине революционные идеи: объекты, классы, виртуальные
методы и др., однако это всё не было воспринято современниками как
нечто грандиозное. Тем не менее, большинство концепций были развиты Аланом Кэйем и Дэном Ингаллсом
в языке Smalltalk. Именно он стал первым широко
распространённым объектно-ориентированным
языком программирования.
В настоящее время количество прикладных языков программирования (),
реализующих объектно-ориентированную парадигму, является наибольшим по
отношению к другим парадигмам. В области системного программирования до
сих пор применяется парадигма процедурного программирования, и
общепринятым языком программирования является язык C. Хотя при взаимодействии
системного и прикладного уровней операционных систем заметное влияние
стали оказывать языки объектно-ориентированного программирования.
Например, одной из наиболее распространенных библиотек
мультиплатформенного программирования является объектно-ориентированная
библиотека Qt,
написанная на языке C++.
Что такое ФП?
И опять я буду использовать редукционистский подход. У ФП есть богатые традиции и история, корни которых глубже, чем само программирование. Существуют принципы, техники, теоремы, философии и концепции, которыми пронизана эта парадигма. Я всё это проигнорирую и перейду сразу к самой сути, к неотъемлемому свойству которое отделяет ФП от других стилей. Вот оно:
f(a) == f(b) если a == b.
В функциональной программе вызов функции с тем же аргументом даёт тот же результат независимо от того, как долго работала программа. Это иногда называют референциальной прозрачностью.
Из сказанного выше вытекает следствие, что f не должна менять части глобального состояния, которые влияют на поведение f. Более того, если мы скажем, что f представляет все функции в системе — то есть все функции в системе должны быть референциально прозрачными — тогда ни одна функция в системе не может изменить глобальное состояние. Ни одна функция не может сделать ничего, что может привести к тому, что другая функция из системы вернёт другое значение при тех же аргументах.
У этого есть и более глубокое следствие — ни одно именованное значение нельзя менять. То есть оператора присваивания нет.
Если тщательно обдумать это утверждение, то можно прийти к заключению, что программа, состоящая только из референциально прозрачных функций ничего не может сделать — так как любое полезное поведение системы меняет состояние чего-нибудь; даже если это просто состояние принтера или дисплея. Однако, если из требований к референциальной прозрачности исключить железо и все элементы окружающего мира оказывается, что мы можем создавать очень полезные системы.
Фокус, конечно, в рекурсии. Рассмотрим функцию которая принимает структуру с состоянием в качестве аргумента. Этот аргумент состоит из всей информации о состоянии, которая нужна функции для работы. Когда работа окончена, функция создаёт новую структуру с состоянием, содержимое которой отличается от предыдущей. И последним действием функция вызывает саму себя с новой структурой в качестве аргумента.
Это только один из простых трюков, которые фукциональная программа может использовать чтобы хранить изменения состояния без необходимости изменять состояние .
Итак, редукционистское определение функционального программирования:
Абстракция
Тут всё предельно просто. При абстракции выделяются главные и наиболее значимые характеристики предмета, одновременно с этим отбрасываются второстепенные и незначительные.
Простой пример: представьте, что мы создаём картотеку сотрудников компании. Естественно, мы вносим их основные характеристики: дату рождения, ИНН, ФИО, номер социального страхования. Разумеется, нас не интересуют ни рост, ни цвет глаз, ни длина волос. То есть мы абстрагируемся от ненужной информации.
А что если нужно создать картотеку модельного агентства? Согласитесь, что здесь ситуация кардинально меняется и вряд ли нам понадобится индивидуальный номер налогоплательщика, а вот данные о внешности будут очень кстати.
7.2 Понятие Тип объект в ООП .
Объект можно рассматривать как усовершенствование типа запись, в которой описание свойств и параметры моделируемой сущности дополняются методами — описаниями действий с объектом. В отличие от записи объект объявляется словом object.
Объект – конкретная реализация абстрактного типа, обладающий характеристиками состояния, поведения, индивидуальности.
Категории объектов:
-
Реальные объекты – абстракция фактического существующего объекта реального мира.
-
Роли – абстракции цели или назначения человека, части оборудования или организации.
-
Инциденты – абстракция чего-то происшедшего или случившегося (наводнение, скачёк напряжения, выборы). —
-
Взаимодействия – объекты получаемые из отношений между другими объектами (перекресток, договор, взятка). —
-
Спецификации – используется для представления правил, критериев качества, стандартов (правила дорожного движения, распорядок дня).
Отношения между объектами:
-
Отношения использования (старшинства) — каждый объект включается в отношения. Может играть 3 роли:
- Активный объект– объект может воздействовать на другие объекты, но сам не поддается воздействию (воздействующий).
- Пассивный объект – объект может только подвергаться управлению, но не выступает в роли воздействующего (исполнитель).
- Посредники – такой объект может выступать в роли воздействующего, так и в роли исполнителя (создаются для помощи воздействующим). Чем больше посредников тем легче модифицировать программу.
-
Отношения включения – один объект включает другие объекты.
Объявление класса создает только шаблон, но не конкретный объект. Чтобы создать объект класса Вох в Java, нужно воспользоваться оператором наподобие следующего:
При создании экземпляра класса, создается объект, который содержит собственную копию каждой переменной экземпляра, определенной в данном классе.
Создание объектов класса представляет собой двух этапный процесс:
-
Объявление переменной типа класса. Эта переменная не определяет объект. Она является лишь переменной, которая может ссылаться на объект:
Вох myBox;
-
Создание объекта. С помощью оператора new динамически (то есть во время выполнения) резервируется память для объекта и возвращается ссылка на него:
myBox = new Вох();
После объявления объекта класса Box, всем переменным класса присваивается значение по умолчанию для заданного типа. Для того, чтобы обратиться к переменной класса и изменить ее или получить значение, используется имя переменной объекта:
В следующем примере объявляется два объекта класса Box и каждому устанавливаются свои значения. Изменения в переменных экземпляра одного объекта не влияют на переменные экземпляра другого.
Объект – конкретная реализация абстрактного типа, обладающая следующими характеристиками: состояние, поведение и индивидуальность.
Модель состояний Мура состоит:
- Из множества состояний: каждое состояние представляет стадию в жизненном цикле объекта.
- Из множества событий: каждое событие означает инцидент, указывающий на эволюционирование.
- Из правил перехода: правило определяет, какое новое состояние достигается объектом под воздействием события.
- Из действий: операции, которые должны быть выполнены, чтобы объект перешел в какое-то состояние.
Категории объектов:
- Реальные объекты – абстракция фактического существующего объекта реального мира.
- Роли – абстракции цели или назначения человека, части оборудования или организации.
- Инциденты – абстракция чего-то происшедшего или случившегося (наводнение, скачёк напряжения, выборы).
- Взаимодействия – объекты получаемые из отношений между другими объектами (перекресток, договор, взятка).
- Спецификации – используется для представления правил, критериев качества, стандартов (правила дорожного движения, распорядок дня).
Отношения между объектами:
-
Отношения использования (старшинства) — каждый объект включается в отношения. Может играть 3 роли:
- Активный объект– объект может воздействовать на другие объекты, но сам не поддается воздействию (воздействующий).
- Пассивный объект – объект может только подвергаться управлению, но не выступает в роли воздействующего (исполнитель).
- Посредники – такой объект может выступать в роли воздействующего, так и в роли исполнителя (создаются для помощи воздействующим). Чем больше посредников тем легче модифицировать программу.
-
Отношения включения – один объект включает другие объекты.
Класс
Класс — это такой тип данных, который состоит из единого набора полей и методов.
Имеет внутренние и внешние интерфейсы для управления содержимым. При копировании через присваивание копируется интерфейс, но не данные. Разные виды взаимодействуют между собой посредством:
- наследования;
- ассоциации;
- агрегации.
При наследовании дочерний класс наследует все свойства родителя, ассоциация подразумевает взаимодействие объектов. Когда объект одного класса входит в другой, это называется агрегацией. Но когда они еще зависят друг от друга по времени жизни, — это композиция.
Одной из главных характеристик является область видимости. Понятие по-разному определяется разными ЯП.
В Object Pascal описывается следующим образом:
ClassName = class(SuperClass)
private
{ использование элементов ограничивается только пределами модуля }
{ здесь указываются поля }
strict private
{ спецификатор доступа стал доступным с выходом Delphi 2007, обозначает то же, что и private }
protected
{ элементы могут использоваться внутри ClassName или при наследовании }
public
{ }
published
{ элементы доступны всем, они отображаются в Object Inspector’e }
end;
Здесь SuperClass — предок, от которого происходит наследование.
Для C++ создание выглядит так:
class MyClass: public Parent
{
public:
MyClass(); // конструктор
~MyClass(); // деструктор
protected:
private:
};
В этом примере Parent является предком, если таковой имеется. Спецификаторы private, public, protected обозначают то же самое, что в предыдущем примере на Паскале. Также мы видим конструктор, деструктор, доступные для любой части программы. У C++ все элементы по умолчанию являются private, соответственно, это можно не указывать.
Методы
Методом класса называют функцию или процедуру, которая принадлежит классу или объекту. Отличие функции от процедуры в том, что функция возвращает значение, а процедура нет. В общем виде синтаксис объявления метода выглядит следующим образом:
модификатор(ы) тип_возвращаемого_значения имя_функции(аргументы)
Модификаторы определяют область видимости, принадлежность метода объекту или классу, является ли метод переопределением и т.п. Тип возвращаемого значения – это любой доступный в C# тип. В качестве типа возвращаемого значения не может использоваться ключевое слово var. Если метод не возвращает ничего, то указывается тип void. Метод может содержать ноль или более аргументов, которые также могут иметь специальные модификаторы, указывающие на то является ли аргумент входным или выходным и т.п. Более подробно про все эти аспекты будет рассказано в одном из уроков, посвященных более глубокому изучению ООП в C#. В рамках данного урока, наша задача – это на интуитивном уровне научиться принципам работы с классами в C#.
Работа с модификатором доступа
Если метод объявлен с модификатором public, то его можно использовать вне класса, например метод Printer из DemoClass
public void Printer() { Console.WriteLine($"field: {field}, Property: {Property}"); }
Такой метод может вызываться в любом месте программы у соответствующих объектов:
var d6 = new DemoClass(11) { Property = 12 }; d6.Printer(); // field: 11, Property: 12
Если мы объявим метод с модификатором private или без модификатора (тогда, по умолчанию, будет принят private), то его уже нельзя будет вызвать снаружи класса:
class DemoClass { // ... private void PrivateMethod() { Console.WriteLine($"Secret method"); } // ... }
(Код в методе Main):
var d7 = new DemoClass(); d7.PrivateMethod(); // Ошибка компиляции!!!
Но при этом внутри класса его вызвать можно:
class DemoClass { // ... public void PublicMethod() { Console.WriteLine($"Public method"); PrivateMethod(); } // ... }
Статические методы и методы объекта
Различают статические методы и методы объекта. Статические имеют модификатор static перед именем метода и принадлежат классу. Для вызова таких методов не обязательно создавать экземпляры класса, мы уже пользовались такими методами из класса Console – это методы Write и WriteLine. Для вызова метода объекта, необходимо предварительно создать экземпляр класса, пример – это метод PublicMethod и Priter у класса DemoClass. Добавим статический метод и метод класса в DemoClass
class DemoClass { // ... public static void StaticMethod() { Console.WriteLine("Message from static method"); } public void NoneStaticMethod() { Console.WriteLine("Message from non static method"); } // ... }
Вызовем эти методы из класса DemoClass в методе Main
DemoClass.StaticMethod(); // Message from static method var d8 = new DemoClass(); d8.NoneStaticMethod(); // Message from none static method
Методы принимающие аргументы и возвращающие значения
Как было сказано в начале данного раздела, методы могут принимать данные через аргументы и возвращать значения, продемонстрируем эту возможность на примере:
class DemoClass { // ... public int MulField(int value) { return field * value; } // ... }
(Код в Main):
var d8 = new DemoClass(10); Console.WriteLine($"MulField() result: {d8.MulField(2)}"); // MulField() result: 20
Абстракция
Важным элементом ООП является абстракция. Человеку свойственно представлять сложные явления и объекты, прибегая к абстракции. Например, люди представляют себе автомобиль не в виде набора десятков тысяч отдельных деталей, а в виде совершенно определенного объекта, имеющего свое особое поведение. Эта абстракция позволяет не задумываться о сложности деталей, составляющих автомобиль, скажем, при поездке в магазин. Можно не обращать внимания на подробности работы двигателя, коробки передач и тормозной системы. Вместо этого объект можно использовать как единое целое.
Эффективным средством применения абстракции служат иерархические классификации. Это позволяет упрощать семантику сложных систем, разбивая их на более управляемые части. Внешне автомобиль выглядит единым объектом. Но стоит заглянуть внутрь, как становится ясно, что он состоит из нескольких подсистем: рулевого управления, тормозов, аудиосистемы, привязных ремней, обогревателя, навигатора и т.п. Каждая из этих подсистем, в свою очередь, собрана из более специализированных узлов. Например, аудиосистема состоит из радиоприемника, проигрывателя компакт-дисков и/или аудиокассет. Суть всего сказанного состоит в том, что структуру автомобиля (или любой другой сложной системы) можно описать с помощью иерархических абстракций.
Иерархические абстракции сложных систем можно применять и к компьютерным программам. Благодаря абстракции данные традиционной, ориентированной на процессы, программы можно преобразовать в составляющие ее объекты, а последовательность этапов процесса — в совокупность сообщений, передаваемых между этими объектами. Таким образом, каждый из этих объектов описывает свое особое поведение. Эти объекты можно считать конкретными сущностями, реагирующими на сообщения, предписывающие им вътолнитьконкретное действие. В этом, собственно, и состоит вся суть ООП.
Принципы ООП лежат как в основе языка Java, так и восприятия мира человеком
Важно понимать, каким образом эти принципы реализуются в программах. Как станет ясно в дальнейшем, ООП яаляется еще одной, но более эффективной и естественной методикой создания программ, способных пережить неизбежные изменения, сопровождающие жизненный цикл любого крупного программного проекта, включая зарождение общего замысла, развитие и созревание
Например, при наличии тщательно определенных объектов и ясных, надежных интерфейсов с этими объектам можно безбоязненно и без особого труда извлекать или заменять части старой системы.
Инкапсуляция
Инкапсуляция ограничивает доступ компонентов к другим, связывает данные с методами для обработки. Для инкапсуляции используется спецификатор доступа private.
Обычно понятия инкапсуляция и сокрытие отождествляются, но некоторые языки различают эти понятия. Другими словами, критичные для работы свойства защищаются, а их изменение становится невозможным.
class Animal {
private $name;
function __construct($name) {
$this->name = $name;
}
function getName() {
return $this->name;
}
}
Name принимается в качестве аргументов конструктора. Когда конструктор будет использован в других частях кода, ничто не сможет изменить элемент name. Как видим, он указывается внутри, для других частей кода он недоступен.
Основы Объектно-Ориентированного Программирования
Объектно-Ориентированное Программирование (ООП) является одной из наиболее популярных парадигм в мире промышленной разработки программного обеспечения. Из других парадигм программирования следует выделить – структурное программирование (основной представитель этого направления – это язык C) и функциональное программирование (к этой группе относятся языки Haskell, F#, Clojure).
Основными строительными элементами ООП являются классы и объекты. Для интуитивного понимания этих понятий приведем такой пример: аналогом класса в реальной жизни является чертеж здания или автомобиля, т.е. некоторый шаблон. Объект – это непосредственно реализация класса в виде некоторой сущности, в нашей аналогии – это конкретное здание или конкретный автомобиль, выполненный по чертежу.
Выделяют три основных “столпа” ООП- это инкапсуляция, наследование и полиморфизм.
Инкапсуляция
Инкапсуляция предполагает два основных момента:
- сокрытие деталей реализации;
- связывание данных и методов для их обработки в одном месте.
“Житейским” примером первого аспекта – сокрытия деталей реализации, может служить автомобиль. Вся его сложность скрыта от пользователя, и нет необходимости разбираться в том, как автомобиль работает, чтобы им пользоваться. Связываение данных и методов предполагает, что в рамках одного класса располагаются данные, определяющие некоторые свойства сущности (например, имя и возраст, если сущность – это человек), и методы для их обработки, получения и изменения.
Наследование
Наследование – это концепция, которая предполагает, что один класс может наследовать функции и данные другого класса. Класс, от которого производится наследование называется родительским или базовым классом, класс который наследует – наследником. Отношение между классом наследником и базовым классом можно определить словом “является”.
Например, представим, что у нас есть базовый класс Фигура, и этот класс содержит только одно свойство – Цвет. Тогда про класс Круг – наследник класса Фигура, можно сказать так: Круг “является” Фигурой. Чего нельзя сказать про отношение между Автомобилем и Двигателем, т.е. Автомобиль не является Двигателем. Это означает, что создание иерархии наследования, в которой Автомобиль – это неследник от Двигателя было бы ошибочной (такой тип отношений назвается композиция).
Полиморфизм
Говоря про полиморфизм в общем, можно сказать, что это возможность обработки данных разных типов одной и той же функцией. Различают параметрический полиморфизм и ad–hoc полиморфизм. Параметрический полиморфизм предполагает, что один и тот же код в функции может работать с данными разных типов. Ad–hoc полиморфизм предполагает создание различных реализаций функций в зависимости от типа аргумента(ов), при этом их сигнатура (без учета типов входных аргументов) остается одной и той же.
В рамках данного урока мы обзорно познакомимся с основными синтаксическими конструкциями языка C# для разработки в рамках ООП парадигмы. В следующих уроках, будет более глубокое погружение в аспекты этой методологии, и ее применение в C#.