第二部分:第6章类与对象 6.1对象模型 ●这是名为 person_ class的类实现。这个实现必须为诸如neW、 getName和 setName的每个公共谓词和构造函数提供定义。这个 实现也可以局部声明和定义附加实体,这种实体仅在这个实现中可 见。在这个例子中,这个类声明了一个名为name的事实变量以存储 人的名字。 ●对于事实变量name,每个对象都有自己的实例。上面子句中的代码 都能引用具有事实变量的那个特例。我们把这种谓词称为对象谓词, 把这个事实变量称为对象事实。 2004.11.3 A|程序设计 6
2004.11.3 AI程序设计 6 第二部分:第6章 类与对象 6.1 对象模型 ⚫ 这是名为person_class的类实现。这个实现必须为诸如new、 getName和setName的每个公共谓词和构造函数提供定义。这个 实现也可以局部声明和定义附加实体,这种实体仅在这个实现中可 见。在这个例子中,这个类声明了一个名为name的事实变量以存储 人的名字。 ⚫ 对于事实变量name,每个对象都有自己的实例。上面子句中的代码 都能引用具有事实变量的那个特例。我们把这种谓词称为对象谓词, 把这个事实变量称为对象事实
令第二部分:第6童类与对象 6.2类实体 ●一个类也可以有为这个类的所有对象共享的实体。我们举个例子, 将上面的例子扩展,添加代码来为 person_ class类创建的对象个数 计数。这个数字会随着每个对象的创建而增加,且永不减少。 ●我们用一个谓词,即谓词 getcreateCount,将类声明予以扩展,这 个谓词用于返回当前计数值: class person_class: person constructors new:(string Name) predicates getcreated Count:->unsigned Count. end class person class 2004.11.3 A|程序设计
2004.11.3 AI程序设计 7 第二部分:第6章 类与对象 6.2 类实体 ⚫ 一个类也可以有为这个类的所有对象共享的实体。我们举个例子, 将上面的例子扩展,添加代码来为person_class类创建的对象个数 计数。这个数字会随着每个对象的创建而增加,且永不减少。 ⚫ 我们用一个谓词,即谓词getCreateCount,将类声明予以扩展,这 个谓词用于返回当前计数值: class person_class : person constructors new : (string Name). predicates getCreatedCount : () -> unsigned Count. end class person_class
令第二部分:第6童类与对象 6.2类实体 ●注意,公共可访问类谓词在类声明中进行声明,而公共可访问对象 谓词在接口中声明。这个规则没有例外:不可能在类声明中声明对 象谓词,也不可能在一个接口中声明类谓词。 ●这个谓词需要在类实现中定义。此外,还需要一个事实来存储计数 值。这个事实必须是一个类事实,即它为所有对象所共享。在一个 类的实现里,可以声明并定义私有对象实体以及私有类实体。声明 类实体时,在相关的声明段前加关键词 Iclass。 2004.11.3 A|程序设计 8
2004.11.3 AI程序设计 8 第二部分:第6章 类与对象 6.2 类实体 ⚫ 注意,公共可访问类谓词在类声明中进行声明,而公共可访问对象 谓词在接口中声明。这个规则没有例外:不可能在类声明中声明对 象谓词,也不可能在一个接口中声明类谓词。 ⚫ 这个谓词需要在类实现中定义。此外,还需要一个事实来存储计数 值。这个事实必须是一个类事实,即它为所有对象所共享。在一个 类的实现里,可以声明并定义私有对象实体以及私有类实体。声明 类实体时,在相关的声明段前加关键词class
令第二部分:第6童类与对象 6.2类实体 ●注意,我们的 person_class类的实现如下: implement person class class facts ●在本例中,我们添加了一个类 created Count: unsigned: =0 事实 create count,并将其初始 clauses 化为零。并且为谓词 getCreated Count(= created Count getcreate Count添加了一个子 facts 句 用于返回事实 name: string created count的当前值。最后, clauses new(Name) 我们在构造函数中添加代码,使 name:= Name 变量 created Count递增。 created Count created Count 1 ●注意,在构造函数中,有两处 clauses getName(= name 赋值形式相同,但一个是更新对 象状态的,另一个是更新类的状 clauses setName (Name): -name:= Name 态的 end implement person_ class 2004.11.3 A|程序设计
2004.11.3 AI程序设计 9 第二部分:第6章 类与对象 6.2 类实体 ⚫ 注意,我们的person_class类的实现如下: implement person_class class facts createdCount : unsigned := 0. clauses getCreatedCount() = createdCount. facts name : string. clauses new(Name) :- name := Name, createdCount := createdCount+1. clauses getName() = name. clauses setName(Name) :- name := Name. end implement person_class ⚫在本例中,我们添加了一个类 事实createCount,并将其初始 化为零 。 并且为谓词 getCreateCount添加了一个子 句 , 用 于 返 回 事 实 createdCount的当前值。最后, 我们在构造函数中添加代码,使 变量createdCount递增。 ⚫注意,在构造函数中,有两处 赋值形式相同,但一个是更新对 象状态的,另一个是更新类的状 态的
令第二部分:第6童类与对象 6.3模块 ●类的一种特殊变体根本不能产生对象,所以就它们所起的作用来讲, 应称之为“模块”而不是类。 class io no type here predicates write:(string ToWrite) write: (unsigned ToWrite) end class io ●这样一个不能创建对象的类很明显是不能包含对象实体的,也不可 能有构造函数。 2004.11.3 A|程序设计 10
2004.11.3 AI程序设计 10 第二部分:第6章 类与对象 6.3 模块 ⚫ 类的一种特殊变体根本不能产生对象,所以就它们所起的作用来讲, 应称之为“模块”而不是类。 class io % no type here predicates write : (string ToWrite). write : (unsigned ToWrite). end class io ⚫ 这样一个不能创建对象的类很明显是不能包含对象实体的,也不可 能有构造函数