Добавлен: 23.05.2023
Просмотров: 337
Скачиваний: 4
На самом деле объект является переменной определённого пользователем типа. Может показаться странным, что объект, который объединяет коды и данные, можно рассматривать как переменную. Однако применительно к объектно-ориентированному программированию это именно так. Каждый элемент данных такого типа является составной переменной.
Примеры реализации инкапсуляции на различных языках программирования приведены ниже.
C#[
Целью инкапсуляции является обеспечение согласованности внутреннего состояния объекта. В C# для инкапсуляции используются публичные свойства и методы объекта. Переменные, за редким исключением, не должны быть публично доступными. Проиллюстрировать инкапсуляцию можно на простом примере. Допустим, необходимо хранить вещественное значение и его строковое представление (например, для того, чтобы не производить каждый раз конвертацию в случае частого использования). Пример реализации без инкапсуляции таков:
class NoEncapsulation
{
public double ValueDouble;
public string ValueString;
}
При этом мы можем отдельно изменять как само значение Value, так и его строковое представление, и в некоторый момент может возникнуть их несоответствие (например, в результате исключения). Пример реализации с использованием инкапсуляции:
class EncapsulationExample
{
private double valueDouble;
private string valueString;
public double ValueDouble
{
get { return valueDouble; }
set
{
valueDouble = value;
valueString = value.ToString();
}
}
public string ValueString
{
get { return valueString; }
set
{
double tmp_value = Convert.ToDouble(value); //здесь может возникнуть исключение
valueDouble = tmp_value;
valueString = value;
}
}
}
Здесь доступ к переменным valueDouble и valueString возможен только через свойства ValueDouble и ValueString. Если мы попытаемся присвоить свойству ValueString некорректную строку и возникнет исключение в момент конвертации, то внутренние переменные останутся в прежнем, согласованном состоянии, поскольку исключение вызывает выход из процедуры.
Delphi
В Delphi для создания скрытых полей или методов их достаточно объявить в секции private.
TMyClass = class
private
FMyField: Integer;
procedure SetMyField(const Value: Integer);
function GetMyField: Integer;
public
property MyField: Integer read GetMyField write SetMyField;
end;
Для создания интерфейса доступа к скрытым полям в Delphi введены свойства.
PHP
class A
{
private $a; // скрытое свойство
private $b; // скрытое свойство
private function DoSomething() //скрытый метод
{
//actions
}
public function ReturnSomething() //открытый интерфейс
{
//actions
}
}
В этом примере закрыты свойства $a и $b для класса A с целью предотвращения повреждения этих свойств другим кодом, которому необходимо предоставить только права на чтение.
Java
class A {
private int a;
private int b;
private void doSomething() { //скрытый метод
//actions
}
public int getSomething() { //открытый метод
return a;
}
}
JavaScript
var A = function() {
// private
var _property;
var _privateMethod = function() { /* actions */ } // скрытый метод
// public
this.getProperty = function() { // открытый интерфейс
return _property;
}
this.setProperty = function(value) { // открытый интерфейс
_property = value;
_privateMethod();
}
}
или
var A = function() {
// private
var _property;
var _privateMethod = function() { /* actions */ } // скрытый метод
// public
return {
getProperty: function() { // открытый интерфейс
return _property;
},
setProperty: function(value) { // открытый интерфейс
_property = value;
_privateMethod();
}
}
}
2.4 Полиморфизм
Полиморфизм – это свойство системы использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта[18].
Например, если вы читаете данные из файла, то, очевидно, в классе, реализующем файловый поток, будет присутствовать метод похожий на следующий: byte[] readBytes( int n );
Предположим теперь, что вам необходимо считывать те же данные из сокета. В классе, реализующем сокет, также будет присутствовать метод readBytes. Достаточно заменить в вашей системе объект одного класса на объект другого класса, и результат будет достигнут.
При этом логика системы может быть реализована независимо от того, будут ли данные прочитаны из файла или получены по сети. Таким образом, мы абстрагируемся от конкретной специализации получения данных и работаем на уровне интерфейса. Единственное требование при этом – чтобы каждый используемый объект имел метод readBytes.
Полиморфизм на первый взгляд кажется самой малоинтересной и малоперспективной парадигмой, но на самом деле это совсем не так. Полиморфизм удивительно мощная и востребованная парадигма.
Полиморфизм часто называется третьим столпом объектно-ориентированного программирования после инкапсуляции и наследования. Полиморфизм – слово греческого происхождения, означающее «многообразие форм» и имеющее несколько аспектов[19].
Во время выполнения объекты производного класса могут обрабатываться как объекты базового класса в таких местах, как параметры метода и коллекции или массивы. Когда это происходит, объявленный тип объекта перестает соответствовать своему типу во время выполнения.
Базовые классы могут определять и реализовывать виртуальные методы, а производные классы – переопределять их, т. е. предоставлять свое собственное определение и реализацию. Во время выполнения, когда клиент вызывает метод, CLR выполняет поиск типа объекта во время выполнения и вызывает перезапись виртуального метода. Таким образом, в исходном коде можно вызвать метод на базовом классе и привести версию производного класса метода, который необходимо выполнить.
Виртуальные методы позволяют работать с группами связанных объектов универсальным способом. Представим, например, приложение, позволяющее пользователю создавать различные виды фигур на поверхности для рисования. Во время компиляции вы еще не знаете, какие именно виды фигур создаст пользователь. При этом приложению необходимо отслеживать все различные типы создаваемых фигур и обновлять их в ответ на движения мыши. Для решения этой проблемы можно использовать полиморфизм, выполнив два основных действия.
Создать иерархию классов, в которой каждый отдельный класс фигур является производным из общего базового класса.
Применить виртуальный метод для вызова соответствующего метода на любой производный класс через единый вызов в метод базового класса[20].
ЗАКЛЮЧЕНИЕ
В ходе выполнения работы была достигнута поставленная цель, а именно: рассмотрены основные понятия объектно-ориентированного программирования.
Для достижения цели были выполнены следующие задачи:
- Рассмотрена сущность объектно-ориентированного программирования;
- Приведены основные характеристики объектно-ориентированного программирования;
- Проанализировано понятие «классы» в контексте объектно-ориентированного программирования;
- Охарактеризовано понятие «Наследование» в контексте объектно-ориентированного программирования;
- Рассмотрено понятие «Инкапсуляция» в контексте объектно-ориентированного программирования;
- Дан анализ понятию «Полиморфизм» в контексте объектно-ориентированного программирования.
Кроме того, при выполнении работы были получены новые теоретические знания, а старые – подкреплены. Работа может быть использована в качестве теоретического пособия на предметах, дающих сведения о программировании, проектировании и реализации автоматизированных информационных систем. Текст работы может предоставить информацию о различных подходах к проектированию информационной системы, и наиболее полную – об объектно-ориентированном подходе, его особенностях, и основных понятиях.
СПИСОК ИСПОЛЬЗОВАННОЙ ЛИТЕРАТУРЫ
- Иванов А.Г., Карпова А.В., Семик В.П., Филинов Ю.Е. Объектно-ориентированная среда программирования. Системы и средства информатики. Вып.2. М.: Наука, 1991.
- Лисков Б., Гатэг Дж. Использование абстракций и спецификаций при разработке программ: Пер. с англ. - М.: Мир, 1989. - 424 с.
- Программирование. Специальный выпуск по объектно-ориентированному программированию. N 6, 1990.
- Фокс Дж. Программное обеспечение и его разработка. М.:Мир, 1985. - 368 с.
- Архангельский А.Я. Программирование Delphi 5 — М: Изд. дом «Бином», 2000.
- Бобровский С.И. Delphi 7: Учебный курс. — СПб.: Питер, 2004.
- Фридман А.Л. Основы объектно-ориентированной разработки программных систем. — М.: ФиС, 2000.
- Статья, авторы: А.Г. Иванов, А.А. Пятницкий, Ю.Е. Филинов // Объектно-ориентированный подход [Электронный ресурс] — Режим доступа. — URL: http://grizlyk.chat.ru/art/ivan1.htm (дата обращения 17.11.2011)
- Сitforum // Обьектно ориентированные языки програмирования [Электронный ресурс] — Режим доступа. — URL: http://citforum.ru/database/articles/art_23.shtml