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

2.10.2.Властивості в Java

В Java поняття властивостей, аналогічне властивостям в Delphi, пов'язане з поняттям інстроспекціі в JavaBeans. Інтроспекція (від англ. Introspection - самоаналіз, самоспостереження) – це процес аналізу Java-компонента (JavaBean) для визначення його можливостей.

JavaBeans були запропоновані в 1996 році у версії Java 1.1 як засіб реалізації ідеї багаторазового використання коду. Самі по собі Bean-компоненти являють собою програмні будівельні блоки, готові до використання. З них може бути зібрана програмна система, як збирається конструкція з окремих деталей. Властивість – це підмножина стану Bean-компонента. Значення, призначені властивостям, визначають поводження й зовнішній вигляд компонента.

Властивості бувають трьох типів: прості, булеві й індексовані.

Прості властивості мають одиночне значення. Воно може бути визначене за допомогою проектних шаблонів (design patterns), заснованих на угодах про імена:

public T get();

public void set(T arg);

Тут Т позначає тип властивості, а N – його ім'я.

Властивість читання/запису (read/write) використовує обидва ці методи для доступу до своїх значень. Властивість тільки для читання (read-only) використовує тільки метод get, а властивість тільки для запису (write-only) – тільки метод set. Наприклад, три простих властивості для класу Box можуть бути визначені в такий спосіб:

public class Box {

private double depth, height, width;

public double getDepth() {

return depth;}

public void setDepth(double d) {

depth = d;}

public double getHeigth() {

return heigth;}

public void setHeigth(double h) {

heigth = h;}

public double getWidth() {

return width;}

public void setwidth(double w) {

width = w;}

}

Булева властивість має значення true або false і може бути специфікована наступними проектними шаблонами (тут, як і раніше, N позначає ім'я властивості):

public boolean is();

public boolean get();

public void set(boolean value);

Щоб витягти значення властивості використовується перший або другий шаблон. Однак, якщо клас використовує обидва методи, застосовується перший шаблон. Наступний приклад показує визначення класу з однією булевою властивістю:

public class Line {

private boolean dotted = false;

public boolean isDotted(){

return dotted;}

public void setDotted(Boolean dotted){

this.dotted = dotted;}

Індексована властивість складається з безлічі значень. Її шаблон має такий вигляд:

public T get(int index), public void set(int index, T value);

public T[] get();

public void set(T value);

Приклад визначення класу з однією індексованою властивістю типу читання/запис показаний нижче:

public class Chart {

private double data[];

public double getData(int index){

return data[index];}

public void setData(int index, double value){

data[index]= value;}

public double[] getData(){

return data;}

public void setData( double[] valuse){

data= new double [values.length];

System.arraycopy(values, 0, data, 0, values.length);}

}

Іншим способом оголошення властивостей Bean-компонента є використання інтерфейсу BeanInfo, що має кілька методів, включаючи наступні:

PropertyDescriptor [] getPropertyDescriptors();

EventSetDescriptor [] getEventSetDescriptor ();

MethodDescriptor [] ge MethodDescriptor s();

Ці методи повертають масиви об'єктів, які мають інформацію про властивості, події й методи Bean-компонента. Реалізуючи ці методи, розроблювач може точно визначити, яка інформація надається користувачеві, що використовує компонент. Інтерфейс BeanInfo визначений у пакеті java.beans.

2.11.Функції-операції в С++

Це спеціальний вид методів, призначений для перевизначення операцій. Подібні методи є й в SmallTalk, але вони реалізуються як звичайні методи.

У С++ можна перевизначати будь-які операції, за винятком:

  • <.> - оператор доступу до елементів класу;

  • <::> - оператор кваліфікації;

  • <? :> - умовний оператор;

  • <.*>, < * > - оператори-покажчики на елементи класу.

Останні дві операції дозволяють організувати непряме звернення до елементів класу через покажчик на клас:

class Note {

public:

int c,d;

};

… … … … …

int Note:: * p; // покажчик на цілий елемент класу Note

Note n .* np = new Note

int i,j;

p = & Note :: c;

i = n.*p; // i буде дорівнювати n.c

p = Note :: d;

j = n, *p; // j = = n.d

i = np->*p; // i = = np->d

Функції-операції в С++ передбачені для визначення операцій, що забезпечують інфіксну форму запису дій для абстрактних типів даних:

C3=add(C1,C2); // префіксна форма

C3=C1+C2; // інфіксна форма

Прототип функції-операції має вигляд:

<тип > operator @ (<список параметрів >) {тіло методу},

де @ - символ операції.

Функції-операції повинні бути обов'язково нестатичними, але їх можна визначати як "дружні" функції.

Розглянемо перевизначення операції додавання для комплексних чисел:

  • "дружня" функція

сlass Complex { double real, image;

public:

Complex(double r, double i) {real = r; imag = i; }

friend Complex operator+ (Complex C1, Complex C2);

…………………};

//реалізація функції

Complex operator+ (Comlex C1, Complex C2)

{ return Complex(C1.real + C2.real, C1.image + C2.image);}

  • метод класу

//додатково в класі Complex визначимо функцію

Complex operator+ (Complex &C)

{return Complex(C.real + real, C.image + image);}

Виклик оператора:

Complex C1,C2,C3;

C3 = operator+(C1,C2); // дружні функції

C3 = C1.operator+(C2); // функція-метод

Подібним чином можуть бути визначені інші унарні операції, наприклад, інкрементація ++:

сlass X { int i, j ;

рublic:

X operator++(){ i++; j++;}

};

При такому визначенні дану операцію можна використати в такий спосіб:

X a;

a = a++;

Примітка: для унарних операцій компілятори, крім AT&T, не розрізняють префіксну й постфіксну форму запису оператора інкрементації. Тому для збереження сумісності варто використати префіксну форму цього оператора.

Таким чином, унарні й бінарні операції можуть бути перевизначені за допомогою "дружніх" функцій, відповідно, з одним або двома параметрами, або за допомогою методу даного класу без параметрів або c одним параметром, відповідно.

Однак існує ряд операцій, які можуть бути визначені тільки як нестатичні методи: <=>,< ()>, <[]>,<→>.

Розглянемо перевизначення операції <>> - “покажчик класу”. Її параметр повинен бути або об'єктом класу, або посиланням цього типу.

struct A { int *point;

float *pfloat;

……………};

class B {

private :

A *a;

public:

B (void) {a = new A;}

A* operator > (void) {return a;}

…………};

Використання даної операції може бути здійснене за схемою:

void main ()

{ B b;

*(B→point)=24; // b.a>point

*(B→pfloat)=0.7; // b.a>pfloat

…………}

Допускається перевизначення операцій new і delete. Тим самим можна явно здійснювати виклик операцій, що виділяють і звільняють пам'ять (malloc, free), а так само здійснювати додаткові операції для ініціалізації змінних.

При перевизначенні операцій необхідно враховувати наступні загальні правила:

  1. Забороняється одночасно перевизначати операції за допомогою "дружньої" і нестатичної функцій.

  2. Перевизначена операція повинна існувати в мові.

  3. Не можна перевизначати директиви препроцесора (починаються з #)

  4. При перевизначені операцій їхній пріоритет не змінюється.

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