Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Мет_для_лаб_Мтзкіт_2011.docx
Скачиваний:
3
Добавлен:
01.12.2018
Размер:
126.32 Кб
Скачать

Інкапсуляція

Взагалі, проблему розв’язують сукупністю об’єктів, які породжуються певними класами, і взаємодіють передаючи один одному повідомлення(виклики методів). За допомогою повідомлень об’єкти керують один одним, примушуючи виконувати дії, що ведуть до розв’язку проблеми.

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

Методом об’єкту може бути процедура або функція з аргументами.

При об’яві предикатів для методів, що мають аргументи, вказують можливі конкретизації аргументів для кожного режиму,як у глобальних предикатів.

Наприклад:

predicates

nondeterm count(real)-(o)

Якщо метод має тільки вхідні параметри, то конкретизацію аргументів можна не вказувати.

Розглянемо приклад, у якому об’єкту передають значення при виклику методу об’єкту.

Приклад1.

Завдання: Нехай треба порахувати середній бал певного студента за всіма дисциплінами і вивести його на екран.

Створимо два класи: «середній_бал», «вивід». Для кожного класу створюється свій об’єкт. З об’єкту класу «середній_бал» до об’єкту класу «вивід» передається середній бал студента. Передача виконується через виклик методу «print_s». Після чого об’єкт класу «вивід »виводить його на екран.

Class середній_бал

Facts-s

nondeterm student(string,string,integer)

single sred(integer,integer)

predicates

nondeterm count(real)-(o)

endclass середній_бал

implement середній_бал

clauses

sred(0,0).

student("Коваль","ЛП",82).

student("Коваль","ФП",78).

count(_):-student(_,_,S),sred(S1,N),N1=N+1,Sr=S+S1,assert(sred(Sr,N1)),fail.

count(Sr):-sred(S,N),Sr= S/N.

endclass середній_бал

Class вивід

predicates

print_s(real)

endclass вивід

implement вивід

clauses

print_s (Sr):-write(" Sredn bal ",Sr).

endclass вивід

goal

R1= середній_бал::new, R2= вивід::new,

R1:count(Sr), R2: print_s (Sr),

R1:delete,R2:delete.

Виводиться: Середній бал 80.

Аргументами предикатів можуть бути посилки на певний об’єкт. Така посилка дозволяє звертатися до будь-якого методу об’єкту, на який передано посилку.

Доменом посилки на певний об’єкт буде ім’я класу, до якого належить об’єкт.

Змінимо програму, що подана вище. Передамо посилку на об’єкт класу «середній бал» об’єкту класу «вивід» через аргумент методу «print_s». Тепер методи та факти класу «середній бал» доступні об’єкту через посилку.

Приклад2.

Class середній_бал

Facts-s

nondeterm student(string,string,integer)

single sred(integer,integer)

predicates

nondeterm count

endclass середній_бал

implement середній_бал

clauses

sred(0,0).

student("Коваль","ЛП",82).

student("Коваль","ФП",78).

count():-student(_,_,S),sred(S1,N),N1=N+1,Sr=S+S1,assert(sred(Sr,N1)),fail.

count().

endclass середній_бал

Class вивід

Predicates

nondeterm print_s (середній_бал)

endclass вивід

implement вивід

clauses

print_s (R):-R:student(F,_,_),R:sred(Sr,N),S=Sr/N,write(F," Середній бал ",S).

endclass вивід

goal

R1= середній_бал::new, R2= вивід::new, R1:count(), R2: print_s (R1), R1:delete,R2:delete.