- •Лабораторная 3 Объектно-ориентированное проектирование и программирование
- •Объектно-ориентированное проектирование Язык объектного моделирования uml. Виды диаграмм
- •Виды диаграмм
- •Диаграмма сценариев или прецедентов
- •Диаграммы классов
- •Диаграмма последовательности
- •Объектно-ориентированное программирование
- •Класс (поля, методы и свойства, области видимости, разработчики и пользователи класса)
- •Инкапсуляция, наследование и полиморфизм как свойства класса
- •Пример программирования классов
- •Пример приложения, использующего классы
Пример программирования классов
Рассмотрим программирование классов на примере. Пусть имеется базовый класс stud (Студент) и класс-потомок grad_stud (Студент-выпускник). Диаграмма классов имеет вид (рис. )
Рис. Диаграмма классов примера
Эту диаграмму можно увидеть в VisualStudio.
Поля базового класса: name (Имя), age (Возраст), ball (Балл), group (Группа). У класса-потомка дополнительно есть поле place (Место распределения). Каждому полю соответствует общедоступное свойство. Метод info(), который присутствует в каждом классе, возвращает информацию о полях класса в виде строки, но работает в каждом классе по-своему, так как в каждом классе неодинаковый набор полей. Поэтому этот метод будет виртуальным.
Особо нужно сказать о методах, имена которых совпадают с именами классов.
Базовая инициализация объекта осуществляется автоматически. Однако иногда бывает необходимо, чтобы на стадии инициализации объекта выполнялись какие-то дополнительные задачи, например, инициализация хранимых объектом данных. Для осуществления подобного применяется функция-конструктор. Все объекты имеют конструктор по умолчанию, который представляет собой не принимающий параметров метод с таким же именем, как у самого класса. Определение класса может также включать несколько методов-конструкторов, принимающих параметры и отличных от конструктора по умолчанию. Такие конструкторы позволяют создавать экземпляр объекта различными способами, например, предоставляя начальные значения для хранимых в объекте данных.
В языке С# конструкторы вызываются с использованием ключевого слова new. Например, создать экземпляр объекта CupOfCoffee с применением конструктора по умолчанию можно было бы следующим образом:
CupOfCoffeemyCup = newCupOfCoffee ();
Экземпляры объектов могут также создаваться и с помощью конструкторов не по умолчанию. Например, у класса CupOfCoffee мог бы существовать конструктор не по умолчанию, принимающий параметр для установки во время создания экземпляра типа кофейных зерен:
CupOfCoffeemyCup = new CupOfCoffee("Blue Mountain");
Деструкторы используются для выполнения очистки после удаления объектов. В целом предоставлять код для метода-деструктора не требуется; это делается автоматически.
Описание классов примера:
public class stud
{
private string name;
privateint age;
privateint ball;
privateint group;
public string Name
{
get { return name; }
set { name = value; }
}
publicint Group
{
get { return group; }
set { if (value>0&&value<50)
group = value; }
}
publicint Age
{
get { return age; }
set
{ if (value > 0 && value < 80)
age = value; }
}
publicint Ball
{
get { return ball; }
set
{ if (value > 0 && value < 100)
ball = value; }
}
public stud(){}
public stud (string aname, int aage, int aball,int agr)
{Name=aname;Age=aage;Ball=aball;Group=agr;}
public virtual string info() { string X;
X = Name + " " + Convert.ToString(Age) + " " +
Convert.ToString(Ball) + " " + Convert.ToString(Group);
return X;
}
}
public class grad_stud : stud
{
private string place;
public string Place
{
get { return place; }
set { place = value; }
}
public grad_stud(){}
public grad_stud (string aname, int aage, int aball, int agr, string aplace) :
base(aname, aage, aball, agr)
{ Place = aplace; }
public override string info()
{
string X;
X = base.info() + " " + Place;
return X;
}
}
Описание класса начинается словом class.
В описании класса-потомка grad_stud после двоеточия указывается имя класса-предка. Конструктор класса-потомка после двоеточия содержит вызов конструктора класса-предка (слово base), а в теле метода – инициализацию собственного поля. Метод info() предка содержит слово virtual, которое означает, что этот метод будет переопределен в потомке. Метод info() потомка содержит слово override, которое означает, что этот метод переопределяет одноименный метод предка; метод вначале вызывает одноименный метод предка, а затем присоединяет собственное поле.
В языке С# предусмотрен один общий базовый класс для всех объектов, имеющий имя object. Его метод GetType() может быть полезен при использовании полиморфизма, поскольку позволяет выполнять различные операции с объектами в зависимости от их типа, а не одну и ту же операцию для всех объектов, как это часто бывает. Например, при наличии функции, принимающей параметр типа object (это означает, что ей можно передавать практически все что угодно), можно было бы сделать так, чтобы в случае обнаружения объектов определенного типа выполнялись дополнительные задачи. В частности, с использованием комбинации из метода GetType и операции typeof (которая представляет собой операцию С#, преобразующую имя класса в объект System.Type) можно было бы обеспечить выполнение операции сравнения, как показано ниже:
if (myObj.GetType () == typeof(MyComplexClass))
{// myObjявляетсяэкземпляромклассаMyComplexClass. }
