Объектно-ориентированный подход в языке C#
Класс в языке C# - ссылочный тип, определенный пользователем. Для классов ЯП C# допустимо только единичное наследование. Реализация множественного наследования - посредством механизма интерфейсов. Членами (элементами) класса могут являться: константа, поле, метод, оператор, конструктор, деструктор; свойство, индексатор, событие; статические и инициализированные члены.
Доступ к членам класса определяется значениями модификатора области действия идентификатора класса: public, protected, private (по умолчанию), internal, protected internal. Инициализация объекта класса - оператором new.
Описание класса C : class C {... int value = 0;... } В описании класса могут присутствовать и другие поля (атрибуты объектов класса) допустимых в C# типов, а также методы (способы манипулирования объектами данного класса).
В C# инициализация поля (связывание его с начальным значением) не является обязательной. Для обеспечения безопасности программного кода и в силу реализации принципа инкапсуляции, инициализация поля некоторого класса C не должна открывать возможностей для доступа к полям и методам данного типа. При этом доступ к элементам класса внутри класса реализуется посредством обращения и не требует полного имени объекта:... value...
Доступ из сторонних классов требует указания полного имени объекта (инициализация и обращение): C c = new C();... c.value... Пример. Описание класса Rectangle, моделирующего прямоугольник с полями origin, width и height, моделирующими начальную точку, ширину и высоту, и методом MoveTo, моделирующим перемещение начальной точки в заданную:
class Rectangle { Point origin; public int width, height; public Rectangle() { origin = new Point(0,0); width=height=0; } public Rectangle (Point p, int w, int h) { origin = p; width = w; height = h; } public void MoveTo (Point p) { origin = p; } }
Пример использования класса Rectangle: Rectangle r = new Rectangle( new Point(10,20),5,5); int area = r.width * r.height; r.MoveTo(new Point(3,3)); инициализация объекта класса Rectangle с начальной точкой (10,20), шириной и высотой 5, подсчет его площади area, перемещение начала отсчета в точку с координатами (3,3).
Из примера: объект является динамическим и изменяет состояние в зависимости от соотнесения времени и внешних воздействий. Рассмотрим простейший, статический случай полей объекта, который в ЯП C# выделен в самостоятельный синтаксический элемент, характеризующийся независимостью от состояния объекта (и потому условно принадлежащий к классу).
Модифицированный пример класса для случая статических полей: class Rectangle { static Color defaultColor; // для каждого класса static readonly int scale; // для каждого класса int x, y, width,height; // для каждого объекта... }
Статические поля defaultColor и scale остаются неизменными внутри класса, а динамические поля x, y, width и height индивидуально изменяются в зависимости от состояния каждого из объектов класса. Доступ изнутри класса осуществляется посредством обращения:... defaultColor... scale... а из внешних классов - посредством обращения:... Rectangle.defaultColor... Rectangle.scale... с указанием полных имен объектов
Рассмотрели особенности реализации полей (как элементов классов с учетом динамики и статики их реализации). Рассмотрим способы манипулирования объектами классов – методов (функциями). Как и поля, методы описываются в блоке описания класса. Пример программы: описание класса 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 - указатель на текущий объект.
Реализация статических методов: class Rectangle { static Color defaultColor; public static void ResetColor() { defaultColor = Color.white; } метод ResetColor – статический (не возвращает значения, т.е. ResetColor - это статическая процедура).
Для доступа к статическому методу изнутри класса - указать краткое имя данного метода: ResetColor(); Для доступа из сторонних классов - указать полное имя статического метода: Rectangle.ResetColor();
Наследование свойств (полей и методов) классов объектов 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); Наследование классами свойств других классов может быть единичным и множественным. Последнее реализуется посредством множественных интерфейсов (что приводит к множественному наследованию типов).
Достоинства и недостатки ОО подхода: Достоинства: возможность моделирования сложной предметной области, высокий уровень абстракции; событийно-ориентированный подход (динамика объектов и возможность манипулирования ими посредством методов приводят к управлению объектами посредством событий); интуитивную близость произвольной предметной области; возможность повторного использования описаний (основана на обращении к полям и методам извне описания классов, на использовании механизма наследования); параметризация методов обработки объектов (основана на использовании механизма интерфейсов). Недостатки - сложность тестирования и верификации программ.