Опубликован: 19.08.2004 | Уровень: для всех | Доступ: платный | ВУЗ: Национальный исследовательский ядерный университет «МИФИ»
Лекция 2:

Объектно-ориентированный подход к программированию

< Лекция 1 || Лекция 2: 12 || Лекция 3 >

Другой фундаментальной составляющей концепции объектно-ориентированного программирования является интуитивно ясное понятие наследования.

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

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

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

  1. фреймовой нотации Руссопулоса (названной так по имени своего создателя, N.D. Roussopulos);
  2. диаграмм Хассе (получивших название по имени ученого, который впервые предложил этот способ наглядного представления наследования, H. Hasse).

Рассмотрим пример программы на языке программирования C#, иллюстрирующий концепцию наследования:

class A {		// базовый класс
		int a;
		public A() {...}
		public void F() {...}
}

// подкласс (наследует свойства 
//класса A, расширяет класс A)
class B:A {
		int b;
		public B() {...}
		public void G() {...}
}

Пример представляет собой описание базового класса A и производного от него класса B.

Класс A содержит целочисленный атрибут (т.е. переменную) a, а также два метода (т.е. функции), A() и F(). Класс B содержит целочисленный атрибут (т.е. переменную) b, а также два метода (т.е. функции) B() и G().

Двоеточие B:A в описании класса B означает наследование.

Отметим, что выше был рассмотрен простейший случай наследования, а именно, единичное наследование. Язык программирования C# позволяет реализовать механизмы, поддерживающие и более сложный случай наследованиямножественное наследование.

Рассмотрим более подробно особенности наследования, которые реализует данный пример программы на языке C#.

Производный класс B наследует от базового класса А свойство a и метод F(). При этом к классу В добавляются собственные свойство b и метод G().

Заметим, что в отношении операции наследования справедливы следующие ограничения:

  1. конструкторы (т.е. функции создания и инициализации классов ) не наследуются;
  2. в языке C# существует возможность замещения наследуемых методов (этот языковой аспект будет рассмотрен более подробно в ходе дальнейших лекций).

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

Один класс языка программирования C# может наследовать лишь свойства другого класса (но не структуры – типа данных, аналогичного кортежу языка программирования SML).

Структура не может наследовать свойства другого типа данных, однако может при этом реализовывать как один, так и несколько интерфейсов.

Подкласс с неявным базовым классом наследует свойства наиболее абстрактного класса, известного под названием "объект" ( object ).

Еще одним фундаментальным компонентом концепции объектно-ориентированного программирования является понятие инкапсуляции.

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

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

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

Хотя инкапсуляция как таковая является фундаментальным свойством ООП, степень инкапсуляции при наследовании может варьироваться в зависимости от типа области видимости объекта, который определяется модификатором видимости. Так, используемый в предыдущем примере модификатор видимости public обеспечивает доступность свойств и методов объекта из произвольного места программы.

К основным свойствам инкапсуляции относятся следующие возможности:

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

Как нам уже известно, важная позитивная особенность языка программирования SML заключается в том, что в нем поддерживается так называемая полиморфная типизация.

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

Рассмотрим пример простейшей полиморфной функции:

void Poly(object o) {
	Console.WriteLine(o.ToString()); 
}

Данная функция реализует отображение на экране объекта ( метод Console.WriteLine ) с предварительным преобразованием его к строковому типу ( метод ToString() ) .

Все приведенные ниже варианты вызова функции:

Poly(25);
Poly("John Smith");
Poly(3.141592536m);
Poly(new Point(12,45));

успешно пройдут компиляцию и завершатся выдачей корректного результата.

Для более подробного самостоятельного ознакомления с тематикой лекции рекомендуется следующий список источников: [22, 38, 51, 53, 61, 63, 75].

< Лекция 1 || Лекция 2: 12 || Лекция 3 >