Лекция 10

 

15. Объектно-ориентированное программирование (ООП)

Объектно-ориентированный подход основан на:

1) выделении классов объектов;

2) установлении свойств объектов и методов их обработки (подпрограммы);

3) создании иерархии классов, наследовании свойств объектов и методов их обработки.

ООП используется при разработке крупных программных проектов.

Традиционный подход:

Y =Z(X); {Z- функция над переменной X} y=sin(x)

То же действие с ООП:

Y =X .Z; {Z- метод, применяемый к объекту X} y=Math.Sin(x)

 

Основные понятия ООП: объект, свойства, метод.

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

Объект – многократно используемый программный модуль – экземпляр класса.

 

15.1. Классы в С#

Однотипные объекты могут объединяться в классы (группы).

Класс – множество объектов, связанных общностью структуры и поведения. Или особый тип записи, имеющий в своем составе поля, свойства и методы обработки.

Конкретный объект, имеющий структуру этого класса, называется экземпляром класса, например button1. Сам класс определяется общими свойствами, которые имеют все экземпляры этого класса.

Например, объекты (экземпляры) button1, button2 … относятся к классу Button.

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

button1. Font.Size label1. BackColor

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

Свойствахарактеристики объекта, его параметры. Объект представляется с помощью присущих ему свойств.

Например:

ОБЪЕКТ_1 (свойство-1, свойство-2, . . . свойство-k).

Свойства объектов различных классов могут пересекаться. Например:

ОБЪЕКТ_А (. . свойство-n, свойство-m, . . . свойство-k).

 

ОБЪЕКТ_B (свойство-1,. . . свойство-n, . . . свойство-k).

ОБЪЕКТ_А – button1 (Font, BackColor, ForeColor, Image, Text, Visible)

ОБЪЕКТ_B – label1 (Font, BackColor, ForeColor, TextAlign, Text, Visible)

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

class <Имя класса> [: список родителей]

{

//объявление переменных экземпляра

доступ тип переменная1;

. . . . . . . . . .

доступ тип переменнаяN;

//объявление методов

доступ тип_возврата метод1(параметры)

{

// тело метода1

}

}

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

Класс может содержать:

Методы. Свойства. Поля. События. Делегаты.

Члены класса могут иметь модификаторы: public, protected, static

15.2. Основные принципы ООП

 

ООП включает в себя 3 основных принципа:

- Инкапсуляция;

- Наследование;

- Полиморфизм.

Инкапсуляция – механизм сокрытия всех внутренних деталей объекта, не влияющих на его внешнее поведение. Это объединение объекта и методов работы с ним (или совмещение данных с методами в одном классе).

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

Эти способы недоступны за пределами класса. Более того, классы ничего не знают друг о друге. Они полностью разделены. Т.о. объект “закрыт” и окружение не может случайно изменить этот объект.

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

Класс представляет характеристики объекта и выполняемые им действия. Действия обычно специфические для конкретных объектов. Их желательно сделать недоступными для других объектов. Помещение методов в класс «прячет» метод для других объектов.

Например, чтобы представить животное как класс C#, необходимо задать ему размер, скорость движения и силу, представленными в виде чисел, а также некоторые функции, например MoveLeft(), MoveRight(), SpeedUp(), Stop() и так далее, в которых можно написать код для выполнения "животным" этих действий.

В C# класс животного может выглядеть следующим образом.

public class :Животное

{

private int Размер;

private float Скорость;

private int Сила;

 

public void MoveLeft() // Метод сместиться влево

{

// Код здесь...

}

// Другие методы здесь...

}

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

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

При просмотре библиотек классов платформы .NET Framework будут видны только открытые члены этих классов. Возможно, каждый класс имеет закрытые члены, используемые внутренне этим классом или связанными классами, которые не предназначены для использования приложениями. Создавая собственные классы, нужно решить, какие члены будут открытыми, а какие — закрытыми.

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

 

Наследование – создание объектовпотомков, которые обладают всеми свойствами объектовпредков. При наследовании объекты–потомки наследуют свойства объектов-предков и приобретают черты, характерные только для них самих.

 

Порожденный класс называется потомком, а тот, от которого он порожден – предком. У объекта может быть только один предок, но много потомков.

 

Объект-потомок наследует все описания и методы объекта–предка. Для него нужно описывать только дополнительные свойства.

Наследуемые свойства и методы можно использовать в неизменном виде или их переопределять (модифицировать).

Нельзя переопределять данные при наследовании. Данные можно только добавлять. С помощью наследования одни классы объектов могут происходить от других.

Возможно многоуровневое наследование. Механизм наследования позволяет многократно применять программный код, создавая иерархию классов.

Класс может наследовать от другого класса. Это означает, что он включает все члены — открытые и закрытые — исходного класса, а также дополнительные определяемые им члены. Исходный класс называется базовым классом, а новый класс — производным классом. Производный класс создается для представления особых возможностей базового класса.

Наследование ускоряет программирование. Для нового класса нужно программировать только дополнения, которые он имеет.

Синтаксис наследования

КлассПотомок : КлассПредок;

Например, можно определить класс ДуховыеИнструменты, который наследует от класса МузыкальныеИнструменты. Класс ДуховыеИнструменты может выполнять те же действия, что и класс МузыкальныеИнструменты и дополнительно одно уникальнок действие. Код C# выглядит следующим образом.

public class ДуховыеИнструменты: МузыкальныеИнструменты

{

public void Дополнительный()

{

// Инструкции

}

}

Класс ДуховыеИнструменты: МузыкальныеИнструменты означает, что новый класс наследует все от класса родителя и имеет новый метод Duh и три закрытые переменные: Размер, Звучание и Форма. Если затем определяется следующий потомок - класс Трамбон, который наследуется от класса ДуховыеИнструменты, то он будет содержать все члены класса ДуховыеИнструменты, а также все члены класса МузыкальныеИнструменты. Но будет иметь и что-то свое, свойственное именно Трамбону.

Полиморфизм – это свойство классов решать схожие по смыслу проблемы разными способами.

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

Это свойство, позволяющее одно и тоже имя метода использовать для решения нескольких задач.

Например, щелочек по кнопке Button1Click() может привести к различным действиям: изменению цвета объекта, его формы, появлению записи, и т.п.

Это достигается переопределением родительского метода в классе-потомке. Переопределение позволяет адресовать разным объектам одно и то же сообщение с разным исполнением. Родитель и потомок ведут себя по-разному.

Один и тот же метод выполняется по-разному для различных объектов.

Полиморфизм – возможность использования методов с одинаковым именем, но с разным содержанием.

Полиморфизмом дает возможность производного класса изменять или переопределять методы, которые он наследует от базового класса. Эта функция используется, если в методе, который имеет отличия, не определен в базовом классе, и нужно выполнить какие-то особые действия.

Существование в классе методов с одним и тем же именем называется перегрузкой, а сами одноименные называются перегруженными методы.

Например, мы можем рассчитать площадь треугольника (square) по трем сторонам, по двум сторонам и углу между ними, по стороне и высоте по другим наборам аргументов. Метод имеет общее название Square, а способы реализации, аргументы – разные. Метод Square – перегружен.

Перегрузка характерна и для законов операции. Например, + знак арифметического сложения, а с другой стороны – операция конкатенации для строковых переменных.

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