Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Медведев_С++_CLI_C#_Java_J#.doc
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
5 Мб
Скачать
☆

2.4Основные свойства объектно-ориентированного программирования

Три основные свойства характеризуют объектно-ориентированное программирование:

  • инкапсуляция,

  • наследование,

  • полиморфизм.

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

Данные с доступом private используются только внутри объекта, с ними оперируют только функции этого объекта. Данные же с доступом public можно использовать и вне объекта.

Аналогично, функции объекта с доступом private можно использовать только внутри объекта, то есть к ним можно обращаться только из функций объекта. В то время как к функциям объекта с доступом public можно обращаться и извне объекта.

Хороший стиль объектно-ориентированного программирования требует объявить наибольшее число данных и функций как private, обеспечив обращение к объекту, в идеале, только через интерфейс, то есть через открытые функции объекта, имеющие доступ public. Доступ private закрывает доступ к данным и функциям объекта извне.

В классе CBaIl примера 2.2.1 функция Set() объявлена как public, поэтому, используя её, допустимо обращение извне к объекту ball класса CBall:

ball.Set (7, 11);// C#

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

Взглянем ещё раз на написание класса CBall на языках C++/CLI, C# и Java в примере 2.2.1. Грамматика сокрытия данных и функций у них разная.

В языках C# и Java используются ключевые слова private и public, которые предшествуют объявлениям данных и описаниям функций (по умолчанию принят доступ private в языке C# и доступ public в языке Java). В языке же C++/CLI используются метки private: и pubIic:. Данные и функции после (ниже) метки private: считаются закрытыми, а после метки public: - открытыми.

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

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

Применительно к неуправляемым данным язык C++/CLI позволяет множественное наследование, при котором класс может быть порождён из нескольких базовых классов. При этом могут возникнуть проблемы, связанные с неоднозначностью наследования. Чтобы избежать неоднозначности языки C# и Java, а также язык C++/CLI применительно к управляемым данным, запрещают множественное наследование классов, но разрешают множественное наследование интерфейсов.

Породим из класса CBaIl, описанного в примере 2.2.1, класс, который бы детализировал созданные из него объекты-шары, прибавив к ним такое качество как цвет. И пусть цвет представляется целочисленной переменной col, значение которой определяет цвет: 0 -красный, 1 - синий, и так далее.

Будучи порождённым из класса CBall, наш новый класс, назовём его CColBall, наследует закрытые координаты и открытые функции класса CBall. В качестве интерфейса пусть класс CColBall имеет те же функции класса CBall, но тела функций Set() и Show() придётся изменить, чтобы они устанавливали значения не только исходных координат объекта-шара, но и переменной col, и выводили значение col на консоль.

Описание класса CColBall, порождённого из базового класса CBall, приведено в примере 2.4.1.