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

Основные понятия объектно-ориентированного подхода: объекты, классы и методы

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

Рассмотрим особенности использования методов на примере следующей программы на языке C#, представляющей описание класса C с полями sum и n и методами Add и Mean:

class C {
	int sum = 0, n = 0;
	public void Add (int x){
		sum = sum + x; n++;
		//процедура
	}
	public float Mean(){
		return(float)sum/n;
		//функция(должна возвратить
		//значение)
	}
}

Прежде всего, отметим, что методы в языке программирования C# делятся на функции (которые обязаны возвращать значение) и процедуры (которые могут и не возвращать значения, на что указывает тип void ). В данном примере Add - процедура, а Mean - функция, в которой возврат значения явно указывается оператором return. Доступ к методу, как и к полю, можно получить изнутри класса:

this.Add(3);
float x = Mean();

а также из других классов, с явным указанием полного имени:

C c = new C();
c.Add(3);
float x = c.Mean();

Заметим, что оператор this представляет собой указатель на текущий объект.

Продолжая аналогию между полями и методами как элементами классов, мы приходим к понятию статического метода. Рассмотрим особенности реализации статических методов в языке программирования C# на следующем примере:

class Rectangle {
	static Color defaultColor;
	public static void ResetColor() {
		defaultColor = Color.white;
	}
}

Как явствует из приведенного примера, под статическим методом понимается операция, определенная над статическими элементами классов (т.е. над статическими полями ).

В данном примере описания класса Rectangle статическим является метод ResetColor (заметим, что он не возвращает значения, т.е. ResetColor - это статическая процедура).

По аналогии с предыдущими случаями, для доступа к статическому методу изнутри класса достаточно указать только краткое имя данного метода:

ResetColor();

В случае доступа из сторонних классов необходимо указать полное имя статического метода:

Rectangle.ResetColor();

Исследовав особенности описания и управления поведением основных элементов классов, объектов и методов для динамического и статического случаев, кратко остановимся на особенностях наследования свойств ( полей и методов ) классов объектов языка программирования C#. Для иллюстрации приведем следующий пример фрагмента программы на языке C#:

class Stack {
	int[] values;
	int top = 0;
	public Stack(int size){
		...
	}
	public void Push(int x){
		...
	}
	public int Pop(){
		...
	}
}

В данной программе приведено (с сокращениями) описание класса, моделирующего стек (аналогичный стеку КАМ) посредством массива элементов values с вершиной top, функциями создания стека Stack размером size и "выталкивания" Push элемента x из стека, а также "вталкивания" Pop элемента в стек.

Аналогично объектам ссылочных типов, объекты классов (как принципиально динамические) хранятся в динамической области памяти (или так называемой "куче"). В силу ограничений безопасности программного кода любой объект языка программирования C# до использования необходимо инициализировать оператором new, например:

Stack s = new Stack(100);

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

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

К преимуществам объектно-ориентированного подхода следует отнести:

  • интуитивную близость произвольной предметной области;
  • возможность моделирования сколь угодно сложной предметной области, высокий уровень абстракции (рассмотренные примеры дают представление о "масштабируемости" моделирования сложных объектов);
  • событийно-ориентированный подход (динамика объектов и возможность манипулирования ими посредством методов приводят к управлению объектами посредством событий );
  • возможность повторного использования описаний (основана на обращении к полям и методам извне описания классов, а также на использовании механизма наследования );
  • параметризация методов обработки объектов (основана на использовании механизма интерфейсов, которые будут подробно рассмотрены в ходе дальнейших лекций).

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

Для более подробного самостоятельного ознакомления с тематикой лекции рекомендуется следующий список источников: [ 24, 28, 36, 66-69, 79-81].