第二部分:第6章类与对象 6.4创建和访问对象 基于上述代码,可以创建一个能创建对象且用io类来写人名的目标qoal (在此对io的类实现暂时不做考虑)。 goal P=person_class: new( John"), Name P: getName o, io: write (name). ●第一行,调用 person_class类构造函数neW。创建的对象绑定到变量P。 第二行,引用了P中对象谓词 getName,并将结果绑定到变量№ame。最 后一行调用了io类的类谓词 write ●注意,引用类中的名字时要用双冒号,如: person_class:new。同样, 引用对象谓词时要用单冒号,如:P: getName。 最后还应注意,尽管构造函数并不像一般函数那样声明,但它们是返回对象 的函数:返回类型包含在类声明中。 2004.11.3 A|程序设计
2004.11.3 AI程序设计 11 第二部分:第6章 类与对象 6.4 创建和访问对象 ⚫ 基于上述代码,可以创建一个能创建对象且用io类来写人名的目标goal (在此对io的类实现暂时不做考虑)。 goal P = person_class::new("John"), Name = P:getName(), io::write(Name). ⚫ 第一行,调用person_class类构造函数new。创建的对象绑定到变量P。 第二行,引用了P中对象谓词getName,并将结果绑定到变量Name。最 后一行调用了io类的类谓词write。 ⚫ 注意,引用类中的名字时要用双冒号,如:person_class::new。同样, 引用对象谓词时要用单冒号,如:P:getName。 ⚫ 最后还应注意,尽管构造函数并不像一般函数那样声明,但它们是返回对象 的函数:返回类型包含在类声明中
第二部分:第6章类与对象 6.5接口对象类型 ●前面已经提到,接口是对象类型。按照字面意义来讲,在用到非对 象类型的地方是可以使用接口的。例如,在如下谓词声明中 class mail predicates sendMessage:(person Recipient, string Message) end class mai 谓词mai: sendMessage以 person(接口)和 string作为参数。 2004.11.3 A|程序设计 12
2004.11.3 AI程序设计 12 第二部分:第6章 类与对象 6.5 接口对象类型 ⚫ 前面已经提到,接口是对象类型。按照字面意义来讲,在用到非对 象类型的地方是可以使用接口的。例如,在如下谓词声明中: class mail predicates sendMessage : (person Recipient, string Message). end class mail ⚫ 谓词mail::sendMessage以person(接口)和string作为参数
第二部分:第6章类与对象 6.6多重实现 ●我们可以创建多个完全不同的类,这些类都创建 person对象。我们 只需声明和实现更多的可构造 person对象的类。这些类的实现可以 有很大区别,比如,可以创建一个将 person存放在数据库中的类 以下便是这样一个类的声明: class personInDB_class: person constructors new :(string DatabaseName, string Name) end class personIndb class ●这里不关心具体的实现。下面的代码显示的是一个关于某特定对象 类型的对象,但它可以有一个完全不同的实现。 2004.11.3 A|程序设计 13
2004.11.3 AI程序设计 13 第二部分:第6章 类与对象 6.6 多重实现 ⚫ 我们可以创建多个完全不同的类,这些类都创建person对象。我们 只需声明和实现更多的可构造person对象的类。这些类的实现可以 有很大区别,比如,可以创建一个将person存放在数据库中的类。 以下便是这样一个类的声明: class personInDB_class : person constructors new : (string DatabaseName, string Name). end class personInDB_class ⚫ 这里不关心具体的实现。下面的代码显示的是一个关于某特定对象 类型的对象,但它可以有一个完全不同的实现
第二部分:第6章类与对象 6.6多重实现 implement personInDB_class facts db. database personID: unsigned clauses new (Data baseName, Name) db: =database_ _class: getDB (DatabaseName) personID: =db: storePerson(Name) clauses petName= db: getPerson Name(personID). clauses setName(Name): -db: setPersonName(personID, Name) end implement personInDB_class 值得注意的是,从这里可以看到,不仅内部行为完全不同,在内部状态上 结构和内容也全然不同 2004.11.3 A|程序设计 14
2004.11.3 AI程序设计 14 第二部分:第6章 类与对象 6.6 多重实现 implement personInDB_class facts db : database. personID : unsigned. clauses new(DatabaseName, Name) :- db := database_class::getDB(DatabaseName), personID := db:storePerson(Name). clauses getName() = db:getPersonName(personID). clauses setName(Name) :- db:setPersonName(personID, Name). end implement personInDB_class ⚫ 值得注意的是,从这里可以看到,不仅内部行为完全不同,在内部状态上, 结构和内容也全然不同
第二部分:第6章类与对象 6.7包容多态性 无论无论同一种类型的对象的实现有多大区别,它们都可以用在同一个场合 里。例如,我们可以用上面所定义的ma类向一个人(对象)发送消息, 不管那个人是由 person_class还是 personInDB_ class构造的。 goal P1= person_class: new( John") mai∷ sendMessage(P1," Hi John,…") P2= personInDB_class:: new ("Paul") mai∷: sendMessage(P2," Hi Paul,…") ●这种行为称为包容( subsumption):只要两个对象都是那段上下文需要 的类型,那么由这个类构造的对象或由那个类构造的对象一样可用 还可以看到,谓词mai: sendMessage可以用于任意 person类的对象中, 所以从某种意义上来讲,即从包容多态( Subsumption Polymorphism) 意义上来讲,这个谓词是多态的( polymorphic 2004.11.3 A|程序设计 15
2004.11.3 AI程序设计 15 第二部分:第6章 类与对象 6.7 包容多态性 ⚫ 无论无论同一种类型的对象的实现有多大区别,它们都可以用在同一个场合 里。例如,我们可以用上面所定义的mail类向一个人(对象)发送消息, 不管那个人是由person_class还是personInDB_class构造的。 goal P1 = person_class::new("John"), mail::sendMessage(P1, "Hi John, ..."), P2 = personInDB_class::new("Paul"), mail::sendMessage(P2, "Hi Paul, ..."). ⚫ 这种行为称为包容(subsumption):只要两个对象都是那段上下文需要 的类型,那么由这个类构造的对象或由那个类构造的对象一样可用。 ⚫ 还可以看到,谓词mail::sendMessage可以用于任意person类的对象中, 所以从某种意义上来讲,即从包容多态(Subsumption Polymorphism) 意义上来讲,这个谓词是多态的(polymorphic)