Релизация на херметизацията в MS Visual C++

Цели на херметизацията

  • да скрие подробностите на реализацията (абстракция)
  • да обедини всички необходими физически и функционални характеристики, за да може обектът правилно да изпълнява предназначението си, т. е. да съвместява данните на обекта с методите за тяхната обработка (свързаност)
  • да защити данните на обекта от несанкциониран достъп (надеждност)

Същността на херметизацията

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

Херметизацията в MS Visual C++ отразява две представи за класа

  1. от страна на интерфейса (характеристиките видими за различните външни потребители на класа/обекта) – обединява знанията за това какво може да върши обектът
  2. от страна на реализацията (характеристиките видими за самия него и неговите екземпляри) – обединява знанията за това как класът/обектът осъществява своите задачи

Потребители на класа/достъп

  • компоненти от външната по отношение на класа среда (др. класове, обекти, структури, подпрограми, модули и т.н.) – достъп само до необходимото за правилното използване на класа
  • самият клас – пълен достъп
  • класове-наследници – по-свободен достъп от външните потребители, но по-ограничен от самия клас

Нива на херметизация в ООЕП

  • общодостъпно, публично (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 данни

}

Правила при използване на приятелски класове и функции

  • Няма значение в коя част от декларацията на класа ще бъде поставена декларацията на “приятеската” връзка (най-често в началото)
  • Като приятел може да се декларира клас или функция, които не са декларирани все още (т.е. еквивалентно е на предварителна декларация)
  • “Приятеските” връзки:
  1. не се наследяват
  2. не са транзитивни
  3. не са комутативни (взаимни)
  • Членове-функции не могат да се декларират като friend преди да е направена пълната декларация на класа, на който принадлежат:

class ForwardDeclared; //Предварителна декларация на класа

class HasFriends

{

friend int ForwardDeclared::IsAFriend();  // Грешка!!!

};

Сходни статии:

  1. Изпълнението на конструктори и деструктори за обекти от произволен клас Ако базовият клас в C++ е деклариран като protected в производния клас, private компонентите му се наследяват като private, а public и protected – като protected. Пример: Ако class base...
  2. Класова йерархия в С++ В C++ всеки програмист може да дефинира и обработва свои собствени типове данни. Тези потребителски дефинирани данни се обозначават като класове. Класът се състои от различни типове данни (свойства), обединени...
  3. Изпълнението на C++ конструктори и деструктори за обекти от произволен клас Задача на C++ за конструктори и деструктори от произволен клас Да се дефинират класовете People, Student и PStudent, така че инициализиращите действия да се изпълняват от подходящи конструктори. Разрушителните действия...
  4. Пример за обектно ориентирана реализация на свързан стек Ще се възползваме от тясната връзка между св. списъци и стекове чрез повторно използване на класа на списъците. Ще приложим 2 разновидности на повторното използване. Отначало ще реализираме класа на...
  5. Обектно-ориентирано проектиране (ООП). Правила за обектно-ориентирано проектиране Проектиране на класове и обекти ПЪРВИ ЕТАП ОТДЕЛЯНЕ НА КЛАСОВЕТЕ И ОБЕКТИТЕ ОТ ПО НА ЗАДАЧАТА Класове и обекти могат да бъдат: реални неща от програмиране на обекти абстракции в...

Студио за уеб дизайн услуги, изработка на сайтове, SEO оптимизация и Интернет реклама Seven Web Design представя своите професионални уеб дизайн умения на високо ниво. Seven Web Design е продукт на Уеб Дизайн България Груп ООД ®
Comments are closed.