Объектно-ориентированное программирование

Объектная модель знаний предполагает сетевую структуру базы знаний, в которой вывод осуществляется с использованием процедур наложения сети запроса на сеть базы знаний, сопоставления объектов как узлов сети, наследования, передачи сообщений между объектами и специальных процедур, присоединенных к объектам. Фактически такой вывод основан на правилах, определяющих обмен информацией между объектами сети с учетом отношений классов и объектов типа наследования, морфизма и др., а также правил преобразований в объектах при наступлении событий.

В теории автоматов используются формальные языки и грамматики, которые в определенной степени позволяют формализовать близкий к объектному подход [8]. Объектный подход в чистом виде реализован в языках Modula, Smalltalk, в виде расширений — в языках C++ и Delphi. В области представления знаний разработаны специальные языковые системы, как правило, на базе языка Lisp, такие как Flavors (расширение Common Lisp), LOOPS (Lisp Object Oriented Programming System) и CLOS (Common Lisp Object System). Далее подробнее рассмотрим принципы объектно-ориентированного программирования в системе Flavors 1171.

В системе Flavors форма определения класса напоминает определение функции, макроса и структуры:

(DEFFLAVOR класс (свойства) (надклассы) (режимы)).

В качестве примера определим класс КОРАБЛЬ:

  • (defflavor корабль ; класс
  • (имя х у х-скорость у-скорость) ; свойства
  • (движущееся-тело) ; надклассы

igettable-instance-variables ; режимы

:settable-instance-variables).

Здесь у объектов КОРАБЛЬ в виде свойств есть ИМЯ, координаты местонахождения X и У, а также компоненты скорости Х-скорость и У-скорость. Кроме того, объекты наследуют другие, свойственные объектам класса ДВИЖУЩЕЕСЯ-ТЕЛО, свойства и действия.

На основе определения класса можно создавать новые экземпляры (instance), принадлежащие этому классу. Это осуществляется вызовом в форме:

(MAKE-INSTANCE класс).

Например, с помощью класса КОРАБЛЬ можно создать экземпляр КОРАБЛЫ и присвоить ему имя TITANIC:

(setq корабль! (make-instance 'корабль'; имя 'titanic')).

DEFFLAVOR реализован в виде сложного макроса (процедуры). Побочным эффектом его вызова будет автоматическая генерация необходимых функций доступа, которые можно использовать при чтении и присваивании значений переменным. Этим эффектом можно управлять посредством следующих, необязательно задаваемых в определении, ключевых режимов:

: GETTABLE-INSTANCE-VARIABLES приводит к генерации системой методов, читающих значения переменных экземпляра (в примере :ИМЯ, :Х, :Y, :Х-скорость и : Y-скорость);

: SETTABLE-INSTANCE-VARIABLES приводит к генерации методов для присваивания новых значений переменным экземпляра. Методы присваивания имеют форму : SET-x, где х — имя переменной экземпляра. Например, имя метода, присваиваемого переменной ИМЯ, будет : SET-ИМЯ.

Определение класса метода производится в форме

(DEFMETHOD (класс метод) лямбда-список форма).

Например, для объекта КОРАБЛЬ можно определить метод : СКОРОСТЬ, который вычисляет скорость судна:

  • (defmethod (корабль :скорость)
  • (sgrt (+ (х х-скорость х-скорость) (* у-скорость у-скорость)))).

Для пересылки сообщений объектам можно использовать форму

(SEND объект метод &REST аргументы).

Получающий сообщение объект активизирует соответствующий ему метод и возвращает значение тому, кто послал сообщение.

Механизму передачи сообщений соответствует универсальный вызов, применяющий функционал FUNCALL, который передает вызываемый метод вместе со своими параметрами объекту, интерпретируемому как функциональный объект:

(FUNCALL объект метод &REST аргументы).

Надклассы используются, чтобы автоматически распространить их свойства и действия на объекты подклассов, задействуя механизм наследования. Так, в примере определения объекта КОРАБЛЬ введен надкласс ДВИЖУЩЕЕСЯ-ТЕЛО. Определенные для объекта КОРАБЛЬ переменные экземпляра X, Y, Х-скорость, Y-скорость и метод : СКОРОСТЬ можно теперь перенести в определение класса объектов ДВИЖУЩЕЕСЯ-ТЕЛО. В этом случае эти параметры не нужно снова перечислять в определениях подклассов, поскольку достаточно сослаться на их принадлежность к над- классу.

 
Посмотреть оригинал
< Пред   СОДЕРЖАНИЕ   ОРИГИНАЛ     След >