• 2009-05-04

    CLIPS中文用户手册(22) - [日志纪事]

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
    http://penning.blogbus.com/logs/38904634.html

    非法继承类

    现在你已经对类有了初步的认识,让我们在图表1.1UPPIE中增加一些其他的类,以使的例子更具有实际意义。通过增加低层类的开发类型正是OOP的方式,由最一般到最特殊的方式增加类。

    1.5所示的是非合法YUKKIE的继承图表。为了简便,这里没有标出OBJECTUSER类。图1.5是一个树(tree)形分级系统,每个节点有唯一的父节点。

    一个常见的树形组织结构例子是经常用在公司中,由总裁,副总裁,部门领导,经理等组成的雇员等级分层(hierarchy)。在这种情况下的等级分层反映的是组织中每个人权利的大小。树通常被用来表示人的组织关系,因为每个人都有唯一的老板,当然CEO除外。组织图表中的节点代表着人在组织中的职位,如总裁,副总裁等。连接各职位的线指代各职能部门分支。在树中的链接通常被称之为分支。

    1.5中,除了YUKKIE意外的类都是合法或不合法的。举个例子,SUPPIE is-a UPPIEMUPPIE is-a UPPIE,YUPPIE is-a UPPIEPUPPIE is-a YUPPIE(没有中年YUPPIE妈妈允许的)。我们也同样可以说YUKKIE is-a YUPPIE和通过继承,YUKKIE is-a UPPIE。然而,我们不想因YUKKIEPIPPIE之间的is-a链接,说YUKKIE is-a PUPPIE

    YUKKIEPUPPIE之间的is-a链接是一个自然错误,让人误以为YUKKIEPIPPIE的子辈(事实上,当她生孩子后是前PUPPIE)。尽管在YUKKIEPUPPIE之间的is-a链接允许YUKKIE可以继承YUPPIEUPPIE,但同时也产生了一个说YUKKIE is-a PUPPIE的不合法的关系。这意味着YUKKIE将继承PUPPIE所有的槽。假设PUPPIE的一个槽用来指定PUPPIE怀孕的月份数,这意味着每个Yuppie小孩将拥有相同的槽来表示他或她怀孕的月份数了。

    更正图表是有可能的。然而,我们需要使用图表来代替树,与树对比,树中除根节点,每个节点都有唯一的父节点,图表中的每个节点可以有零个或多个节点与之连接。一个类似的例子是地图,每个城市都是一个节点,道路将他们互相链接。树与图表的另一个不同是,多数类型的树都有分层结构,而普通的图表没有。

    1.6显示的是非法YuppieYUKKIE。一个新类CHILD被创建,YUKKIE与他的两个超类YUPPIECHILD之间用is-a链接。注意,YUKKIEPUPPIE之间的非法链接不再存在了。

    这里采用图表,因为YUKKIE类有两个直接的超类,所以代替了只能有一个的树。图表中同样有分层结构,因为所有的类通过is-a链接自最一般的USER到最特殊的SUPPIE,MUPPIE,PUPPIEYUKKIE安排。通过图1.6,我们可以说YUKKIE is-a YUPPIE,同时也可以说YUKKIE is-a CHILD

    下面显示的是增加如图1.6子类的命令。

     

    CLIPS>(clear)

    CLIPS>(defclass UPPIE (is-a USER))

    CLIPS>(defclass CHILD (is-a USER))

    CLIPS>(defclass SUPPIE (is-a UPPIE))

    CLIPS>(defclass MUPPIE (is-a UPPIE))

    CLIPS>(defclass YUPPIE (is-a UPPIE))

    CLIPS>(defclass PUPPIE (is-a YUPPIE))

    CLIPS>(defclass YUKKIE (is-a YUPPIE CHILD))

     

    定义类的顺序必须如上,一个类必须在他的子类之前被定义,如:

     

    (defclass CHILD (is-a USER))

     

    必须在下面之间输入:

     

    (defclass YUKKIE (is-a YUPPIE CHILD))

     

    当你试图在CHILD之前输入YUKKIE类时,CLIPS会产生一个错误的消息。

    注意图1.6SUPPIEMUPPIEYUPPIE自左到右的出现顺序。这对应了我们在CLIPS中输入顺序的惯例。你同样可以看到为什么CLILD被画在UPPIE的右边,因为它是在UPPIE类的后面输入。

    在图1.6中,注意到YUKKIE-YUPPIE的链接出现在YUKKIE-CHILD的左边。另一个惯例是,我们通常由图表中自左到右出现的顺序,来自左到右书写优先表中的直接超类。YUKKIE优先表中的YUPPIECHILD顺序符合这种惯例。

     

     

     


    收藏到:Del.icio.us