Релизация на херметизацията в MS Visual C++
Цели на херметизацията
- да скрие подробностите на реализацията (абстракция)
- да обедини всички необходими физически и функционални характеристики, за да може обектът правилно да изпълнява предназначението си, т. е. да съвместява данните на обекта с методите за тяхната обработка (свързаност)
- да защити данните на обекта от несанкциониран достъп (надеждност)
Същността на херметизацията
Добре разработеният клас се стреми да инкапсулира цялото състояние и поведение, необходимо за изпълнение на задачите, за които се разработва, като в същото време се стреми да скрие и защити колкото може повече детайли на вътрешното си устройство.
Херметизацията в MS Visual C++ отразява две представи за класа
- от страна на интерфейса (характеристиките видими за различните външни потребители на класа/обекта) – обединява знанията за това какво може да върши обектът
- от страна на реализацията (характеристиките видими за самия него и неговите екземпляри) – обединява знанията за това как класът/обектът осъществява своите задачи
Потребители на класа/достъп
- компоненти от външната по отношение на класа среда (др. класове, обекти, структури, подпрограми, модули и т.н.) – достъп само до необходимото за правилното използване на класа
- самият клас – пълен достъп
- класове-наследници – по-свободен достъп от външните потребители, но по-ограничен от самия клас
Нива на херметизация в ООЕП
- общодостъпно, публично (public) ниво – определя достъп за всички възможни потребители на класа до характеристики, наричани открити, общодостъпни или публични
- защитено (protected) ниво – отнася се до характеристики, наречени защитени, които са достъпни за класа и неговите наследници
- частно (private) ниво – отнася се до характеристиките, които са достъпни само за самия клас. Тези характеристики се наричат закрити или частни
Херметизация в С++
Капсулиране на обектите в C++ се постига чрез съчетаването на две езикови средства:
- Прилагане на атрибутите за достъп (private, protected и public) в два различни смисъла (по отношение на два различни елемента от декларацията на класа):
- за контролиране на достъпа до членовете на класа и
- за определяне на достъпа до членовете на класа-предшественик
- Задаване на т.н. “приятели” на класа (friend), които могат да бъдат други класове или функции
Контролиране на достъпа до членовете на класа
- Синтаксис:
<атрибут за достъп> : <декларации на членове на класа>;
- Пример:
class BaseClass
{
public: int PublicFunc(); // public член
protected: int ProtectFunc(); // protected член
private: int PrivateFunc(); // private член
};
- Семантика – private е достъпът по подразбиране:
Определяне на достъпа до членовете на класа-предшественик (начин на пораждане)
- Синтаксис:
Class <име_клас>:<атрибут за достъп> <клас_предшеств.>
{
<тяло на класа>;
};
- Според начина на пораждане има три вида наследяване: публично (public), защитено (protected) и закрито наследяване (private)
Определяне на достъпа до членовете на класа-предшественик: семантика
- Семантика (виж примера):
Таблица за достъп до членовете на класа-наследник
в зависимост от определения за тях достъп в предшественика и начина на пораждане
При private пораждане горните правила се отнасят само за членовете от предшественика, които не са static. public static членовете са достъпни в наследника чрез операцията за област на действие
Приятелски класове и функции
- Приятелските класове и функции (обикновени или членове на други класове) не са елементи на класа. Те са външни класове и функции (вкл. main()), получили привилегирован достъп до private, protected и public членовете на класа, които са декларирани в него или наследени
- Пример за приятелска функция:
class Complex {
public:
Complex( float re, float im ) {real=re;imag=im;};
friend Complex CompSum( Complex first, Complex second );
void Print(){cout<<”re:”<<real<<” im:”<<imag<<endl;} ;
private:
float real, imag;
};
Complex CompSum( Complex first, Complex second ) {
return Complex( first.real + second.real,
first.imag + second.imag );
}
void main(){
Complex c1(1,1),c2(2,2);
CompSum(c1,c2).Print();
}
Приятелски класове и функции: Пример
- Пример за приятелски клас:
// Пример за friend клас
class YourClass
{
friend class YourOtherClass; // Деклар. на friend клас
private:
int topSecret;
};
class YourOtherClass
{
public:
void change( YourClass yc );
};
void YourOtherClass::change( YourClass yc )
{
yc.topSecret++; // Има достъп до private данни
}
Правила при използване на приятелски класове и функции
- Няма значение в коя част от декларацията на класа ще бъде поставена декларацията на “приятеската” връзка (най-често в началото)
- Като приятел може да се декларира клас или функция, които не са декларирани все още (т.е. еквивалентно е на предварителна декларация)
- “Приятеските” връзки:
- не се наследяват
- не са транзитивни
- не са комутативни (взаимни)
- Членове-функции не могат да се декларират като friend преди да е направена пълната декларация на класа, на който принадлежат:
class ForwardDeclared; //Предварителна декларация на класа
class HasFriends
{
friend int ForwardDeclared::IsAFriend(); // Грешка!!!
};
Сходни статии:
- Изпълнението на конструктори и деструктори за обекти от произволен клас Ако базовият клас в C++ е деклариран като protected в производния клас, private компонентите му се наследяват като private, а public и protected – като protected. Пример: Ако class base...
- Класова йерархия в С++ В C++ всеки програмист може да дефинира и обработва свои собствени типове данни. Тези потребителски дефинирани данни се обозначават като класове. Класът се състои от различни типове данни (свойства), обединени...
- Изпълнението на C++ конструктори и деструктори за обекти от произволен клас Задача на C++ за конструктори и деструктори от произволен клас Да се дефинират класовете People, Student и PStudent, така че инициализиращите действия да се изпълняват от подходящи конструктори. Разрушителните действия...
- Пример за обектно ориентирана реализация на свързан стек Ще се възползваме от тясната връзка между св. списъци и стекове чрез повторно използване на класа на списъците. Ще приложим 2 разновидности на повторното използване. Отначало ще реализираме класа на...
- Обектно-ориентирано проектиране (ООП). Правила за обектно-ориентирано проектиране Проектиране на класове и обекти ПЪРВИ ЕТАП ОТДЕЛЯНЕ НА КЛАСОВЕТЕ И ОБЕКТИТЕ ОТ ПО НА ЗАДАЧАТА Класове и обекти могат да бъдат: реални неща от програмиране на обекти абстракции в...