Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ООП_KAZYMYR.doc
Скачиваний:
14
Добавлен:
09.11.2019
Размер:
3.71 Mб
Скачать

2.8."Дружні" методи

“Дружній” означає. що хоча метод і не визначається усередині класу, він має доступ до закритих елементів класу.

Примітка: в SmallTalk і Java "друзів" класу нема, тому що все визначається усередині класу.

2.8.1.«Дружні» функції в С++

"Друзі" класу розширюють можливості використання функцій для об'єктів класового типу. У С++ можна визначати функції, яким дозволяється працювати зі змінними, визначеними в класі. Ці функції визначаються зі специфікатором friend.

Розглянемо функцію, що з'ясовує, чи перебуває точка усередині прямокутника:

Int HasPoint (Rectangle &r, Point &p)

{return r.left <= p.x && p.x <= r.right && r.botton >=

p.y && p.y >= r.top;}

Будемо вважати, що змінні left, right, botton, top сховано у своїх класах.

сlass Rectangle;

сlass Point { float x,y;

………………

friend int HasPoint (Rectangle &r, Point &p);};

сlass Rectangle { float left, right, botton, top;

………………

friend int HasPoint (Rectangle &r, Point &p);};

………………

void main (){ Point a;

Rectangle b;

HasPoint(b,a);

}

У даному прикладі поля класів Rectangle і Point є закритими. Тому оголошено дружню функцію HasPoint, що має доступ до полів даних і методів цих класів.

Якщо необхідно зробити "дружніми" всі функції даного класу, то весь клас оголошується "дружнім":

сlass Y { friend class X;

…………......};

Це те ж саме, що й

сlass X { int f();

void g();

…………......};

сlass Y { friend int X::f();

friend void X::g();

…………};

Примітка: "дружба" класів не транзитивна, тобто якщо клас А "дружить" із класом В, а В "дружить" із класом С, то із цього не випливає, що А теж "дружить" із класом С.

2.8.2.Аналог дружніх функцій в Delphi

Властивості "дружніх" функцій в Delphi реалізуються через покажчики на методи. Такий підхід забезпечує розширення можливостей класів шляхом делегування функціональності інших класів, а не породженням підкласів і заміщенням методів. Замість визначення похідного класу з удосконаленими методами використовується покажчик на метод уже існуючого класу.

Розглянемо це на прикладі обробки події OnChange для смуги горизонтального прокручування списку, коли список повинен показувати число смужок залежно від стану смуги прокручування. Спочатку визначимо тип:

Type

TNotifyEvent = procedure (Sender: TObject) of object;

{наприкінці є присутнім of object}

Будь-яка змінна з типом TnotifyEvent повинна бути призначена методу, що приймає єдиний параметр Tobject.

Тепер визначимо клас TscrollBar, що містить покажчик на метод TnotifyEvent:

TscrollBar = class (TWinControl)

private

FOnChange : TNotifyEvent; {визначаємо покажчик на метод}

protected

procedure Change;

public

property OnChange: TNotifyEvent read FOnChange write FOnChange;

end;

{зв'язуємо властивість OnChange з FOnChange}

implementation

procedure TscrollBar.Change;

begin

If Assigned (FOnChange) then { чи зв'язаний покажчик з методом?}

FOnChange (Self); {виконання методу}

end;

Визначаємо новий клас – форму TForm1 з рядком скролінга:

Type TForm1 = class (TForm)

ScrollBar1: TScrollBar;

ListBox1: TListBox;

procedure ScrollBar1Change (Sender: TObject);

end;

Implementation

procedure TForm1. ScrollBar1Change (Sender: TObject);

begin

ListBox1.Columns:=ScrollBar1.Position;

end;

На етапі виконання:

var TheForm: TForm1;

begin

TheForm:=TForm1.Create(Application);

TheForm.ScrollBar1.OnChange:=TheForm.ScrollBar1Change;

{зв'язуємо OnChange з ScrollBar1Change }

end.

При клацанні на смузі прокручування буде викликаний метод Change, який перевіряє, чи дійсно покажчик FOnChange пов'язаний з яким-небудь методом і якщо «так», то викликається відповідний метод.

С хема використання покажчика на метод у даному прикладі приведена на рис. 2.5.

Рис. 2.5. Схема використання покажчика на метод

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]