Параллельное и распределенное программирование на С++ (Хьюз, Хьюз) - страница 331

Рис. 12.3. Общий вид простого логического цикла активизации агента


12.4.2.2. Стратегии логического вывода агента

Этот агент обладает способностями рассуждать, реализованными частично классом >proposition и частично м етодо м >determineVacationAppropriate(). Вспомните, что в классе >proposition объявлен метод >operator() =0 в виде чисто виртуальной функции. Поэто м у в производно м к л ассе необходи м о реализовать м етод operator (). Мы используем этот оператор, чтобы объект предположения мог самостоятельно определить свою «суть», т. е. понять, истинно данное предположение или ложно. Это означает самодостаточность классов предположений. Именно в самодостаточности и состоит фундаментальный принцип объектно-ориентированного программирования: класс представляет собой самостоятельную конструкцию, инкапсулирующую его характеристики и поведение. Итак, одной из основных линий поведения класса предположений и его потомков является способность определять, истинно данное предположение или нет. Для реализации этого средства используется перегрузка операторов и объекты-функции. Рассмотри м фрагменты определения класса >proposition и определений его потомков.

>//Листинг 12.6. Фрагменты определений класса

>// proposition и его потомков

>template bool proposition::operator&&(

>proposition &X)

>{

>return((*this)() &&X());

>template bool proposition::operator||(

>proposition &X)

>{

>return((*this)() || X());

>template proposition::operator void*(void) {

>return((void*)(TruthValue));

>bool trip__announcement::operator()(void) {

>list::iterator I; if(directTrip()){

> return(true);

>}

>I = UniverseOfDiscourse.begin();

>if(validTrip(I,Origin)){

> return(true);

>}

>return(false);

>}

Операторы "||" и "&&", используемые в классах предположений, позволяют определить, истинно данное предположение или ложно. В каждом из этих определений операторов в конечном счете вызывается метод >operator () , определенный в классе-потомке. Обратите внимание на определение оператора "||" (см. листинг 12.6). Этот оператор определен следующим образом.

>template bool proposition::operator||

>(proposition &X)

>{

>return((*this)() || X());

>}

Это определение позволяет использовать следующий код.

>trip_announcement А;

>performance_statement В;

>if (А || В) {

>// Какие-нибудь действия.

>}


При вычис л ении выражений А или В будет вызван оператор operator (). Каждый класс предположений определяет поведение оператора operator () по своему. Напри м ер, в классе trip_announcement