快速业务通道

面向对象语言概论(三)

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-29
n和Vegitarian两种类型,同时,我们有Vegitable和Food两种类型。而且,

Vegitable <: Food.

ObjectType Person is



method eat(food: Food);

end;

ObjectType Vegetarian is



method eat(food: Vegitable);

end;

这里,从常识,我们知道一个Vegitarian是一个人。所以,我们希望可以有Vegetarian <: Person.

不幸的是,因为参数是反协变的,如果我们错误地认为Vegetarian <: Person, 根据subtype的subsumption原则,一个Vegetarian的对象就可以被当作Person来用。于是一个Vegetarian就可以错误地吃起肉来。

使用泛型技术,我们引入Type Operator (也就是,从一个类型导出另一个类型,概念上类似于对类型的函数)。

ObjectOperator PersonEating[F<:Food] is



method eat(food: F);

end;

ObjectOperator VegetarianEating[F<: Vegetable] is



method eat(food: F);

end;

这里使用的技术被称作Bounded Type Parameterization. (Trelli/Owl, Sather, Eiffel, PolyTOIL, Raptide以及Generic Java都支持Bounded Type Parameterization. 其它的语言,如C++, 只支持简单的没有类型约束的泛型)

F是一个类型参数,它可以被实例化成一个具体的类型。 类似于变量的类型定义,一个bound如F<:Vegitable限制了F只能被Vegitable及其子类型所实例化。所以,VegitarianEating[Vegitable], VegitarianEating[Carrot]都是合法的类型。而VegitarianEating[Beef]就不是一个合法的类型。类型VegitarianEating[Vegitable]是VegitarianEating的一个实例,同时它等价于类型Vegitarian. (我们用的是基于结构的subtype)

于是,我们有:

对任意F<:Vegitable, VegitarianEating[F] <: PersonEating[F]

对于原来的Vegitarian类型,我们有:

Vegetarian = VegetarianEating[Vegetable] <: PersonEating[Vegitable]

这种关系,正确地表达了“一个素食者是一个吃蔬菜的人”的概念。

除了Bounded Type Parameterization之外,还有一种类似的方法也可以解决这个素食者的问题。这种方法被叫做:Bounded Abstract Type

请看这个定义:

ObjectType Person is

Type F<: Food;



var lunch: F;

method eat(food: F);

end;

ObjectType Vegetarian is

Type F<: Vegitable;



var lunch: F;

method eat(food: F);

end;

这里,F<:Food的意思是,给定一个Person, 我们知道他能吃某种Food, 但我们不知道具体是哪一种。这个lunch的属性提供这个Person所吃的Food.

在创建Person对象时,我们可以先选定一个Food的subtype, 比如说,F=Dessert. 然后,用一个Dessert类型的变量赋给属性lunch. 最后再实现一个eat(food:Dessert)的方法。

这样,Vegetarian <: Person是安全的了。当你把一个Vegetarian当作一个Person处理时,这个Vegitarian可以安全地吃他自带的午餐,即使你不知道他吃的是肉还是菜。

这种方法的局限在于,Person, Vegitarian只能吃他们自带的午餐。你不能让他们吃买来的午餐。

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号