Класс в ООП

Автор работы: Пользователь скрыл имя, 30 Декабря 2010 в 12:17, реферат

Краткое описание

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

Содержимое работы - 1 файл

OOП.docx

— 37.73 Кб (Скачать файл)

Теперь дочерние классы CLine, CRect и CEllipse можно образовывать от двух базовых CPos и CProp, которые являются не связанными друг с другом. Для того чтобы построить класс на основе двух базовых они указываются друг за другом через запятую следующим образом:  

class CLine : public CPos, public CProp

{

public:

CLine() : CPos(), CProp() {}

CLine(int x1, int y1, int x2, int y2, int w, int clr) :

CPos(x1,y1,x2,y2), CProp(w,clr) {}

~CLine() {}  

void Draw() {SetWidth(width); SetColor(color);

MoveTo(sp_x, sp_y); LineTo(ep_x, ep_y);

}

};  

Аналогичным образом  строятся классы CRect и CEllipse. Здесь следует отметить, что конструктор CLine(int x1, int y1, int x2, int y2, int w, int clr) класса CLine вызывает конструкторы двух базовых классов, которые перечислены через запятую с указанием в них конкретных переменных. Работа с функциями класса CLine через его представитель имеет следующий вид:  

CLine line;

line.SetProperty(1,0);

line.SetParam(10,10,20,20);

line.Draw();  

Благодаря полиморфизму, функции SetProperty() и SetParam() базовых классов вызываются непосредственно из класса CLine.

6.3. Дружественные  классы и функции 

В рассмотренных  примерах наследования функция Draw() дочерних классов использует переменные sp_x, sp_y, ep_x, ep_y, width и color базовых классов, которые необходимо было объявлять в разделе protected. Вместе с тем лучшую защиту этих переменных можно обеспечить, объявив их частными (private). Но тогда при наследовании они оказываются недоступными в производных классах, а реализация функции Draw() невозможной. Чтобы разрешить эту проблему, дочерние классы, использующие частные переменные базовых классов, необходимо объявить как дружественные к соответствующим базовым.  

Для объявления дружественного класса используется ключевое слово  friend, за которым следует имя класса. Следующий пример демонстрирует объявление дружественного класса CLine классам CPos и CProp:  

class CLine; //идентификатор класса  

class CPos

{

protected:

CPos() {}

CPos(int x1, int y1, int x2, int y2) {SetParam(x1,y1,x2,y2);}

~CPos() {}  

public:

friend CLine; //объявление дружественного класса  

void SetParam(int x1, int y1, int x2, int y2);  

protected:

int sp_x, sp_y;

int ep_x, ep_y;

};  

class CProp

{

protected:

CProp() {}

CProp(int wdt, int clr) {SetProperty(wdt,clr);}

~CProp();  

public:

friend CLine; //объявление дружественного класса  

void SetProperty(int wdt, int clr);  

protected:

int width, color;

};  

В данном примере  класс CLine является производным от классов CPos и CProp, поэтому он объявляется после них. Однако, чтобы сделать класс CLine дружественным базовым классам он должен быть объявлен до них, иначе компилятор С++ выдаст синтаксическую ошибку. Чтобы разрешить эту проблему язык С++ допускает использование идентификатора класса, который говорит компилятору о том, что такой класс есть, но его описание будет дано ниже. Благодаря этому удается организовать перекрестные ссылки между классами, стоящие на разных уровнях иерархии. В результате такой организации частные элементы sp_x, sp_y, ep_x, ep_y, width и color классов CPos и CProp оказываются доступными только одному производному классу CLine и никакому другому, что обеспечивает их лучшую защиту по сравнению с уровнем доступа protected.  

Дружественными можно  объявлять не только классы, но и  отдельные функции классов. Например, для класса CLine важно, чтобы переменные sp_x, sp_y, ep_x, ep_y, width и color были доступны только функции Draw(). Поэтому было бы целесообразно ее и сделать дружественной, а не весь класс целиком. Однако для этого потребовалось бы ее прототип описать до классов CPos и CProp, что сделать в данном случае невозможно, т.к. класс CLine, в котором находится функция Draw(), описан в последнюю очередь. Но, в общем, дружественные функции можно задавать, как показано в следующем фрагменте программы:  

class CPos;

class CLine

{

public:

CLine() {}

~CLine() {}  

void Draw(CPos* pos);

};  

class CPos

{

public:

CPos() {}

~CPos() {}  

friend void CLine::Draw(CPos* pos);  

private:

int sp_x, sp_y;

int ep_x, ep_y;

};  

void CLine::Draw(CPos* pos)

{

MoveTo(pos->sp_x, pos->sp_y);

LineTo(pos->ep_x, pos->ep_y);

}  

Особенностью организации  классов CLine и CPos является то, что функция Draw() класса CLine использует в качестве аргумента указатель на класс CPos, который объявлен ниже. Поэтому реализации функции Draw() должна быть объявлена после определения класса CPos, иначе компилятор С++ выдаст сообщение об ошибке. Благодаря тому, что функция Draw() является дружественной классу CPos, она может получать доступ к частным элементам этого класса через переданный ей указатель.

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

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

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

ООП

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

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

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

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

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

Объект – это  экземпляр некоторого класса объектов или просто класса. Так автомобиль Audi 6 является экземпляром класса автомобилей данной модели, приемник Sony SW-7600G так же будет представителем класса одноименных приемников. Таким образом, класс – это абстрактное понятие. Отношение класса и объекта примерно такое же, как платоновские идеи и объекты реального мира. На UML – унифицированном языке моделирования – класс отображается в виде прямоугольника, разделенного на три части. В первой содержится имя класса, во второй – атрибуты, в третьей – методы (рис. 1, а).

Классы могут быть связаны друг с другом различными отношениями. Одним из основных таких  отношений является отношение класс  – подкласс, известный в объектно-ориентированном  программировании как наследование. Например, класс автомобилей Audi 6 является подклассом легковых автомобилей, который в свою очередь входит в более крупный класс автомобилей, а последний является подклассом класса транспортных средств, который помимо автомобилей включает в себя самолеты, корабли поезда и т. д. Примером подобных отношений, являются системы классификации в ботанике и зоологии. Отношением, обратным наследованию, является обобщение или генерализация. Она указывает, что некий класс, является более общим (обобщенным) классом другого класса. Класс транспортных средств, к примеру, является генерализацией классов автомобилей, самолетов и кораблей. В UML принято пользоваться именно понятием генерализация, что отразилось и в символе, представляющем это отношение: большая не закрашенная стрелка, направленная на класс, являющимся обобщением некоторых классов (рис. 1, б).  

При наследовании все  атрибуты и методы родительского  класса наследуются классом-потомком. Наследование может быть многоуровневым, и тогда классы, находящиеся на нижних уровнях иерархии, унаследуют все свойства (атрибуты и методы) всех классов, прямыми или косвенными потомками которых они являются. Класс B унаследует атрибуты и методы класса A и, следовательно, будет обладать атрибутами A, B, C и D и методами A, B, C и D, а класс C – атрибутами A, B, C, E, F и методами A, B и E.  

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

При наследовании одни методы класса могут замещаться другими. Так, класс транспортных средств  будет обладать обобщенным методом  движения. В классах-потомках этот метод  будет конкретизирован: автомобиль будет ездить, самолет – летать, корабль – плавать

Информация о работе Класс в ООП