结构子类型
Felix结构不提供任何继承机制。但是,可以定义子类型强制:
struct Point {
x: int;
y: int;
fun norm => max (self.x,self.y);
proc reset { self.x <- 0; self.y <- 0;}
proc set (a:int, b:int) { self.x <- a; self.y <- b; }
}
struct ColouredPoint {
p: Point;
colour : int;
}
var colp = ColouredPoint (p, 5);
supertype Point (cp: ColouredPoint) => Point ( cp.p.x, cp.p.y);
println$ colp.norm.str;
强制具有子类型ColouredPoint参数,并返回父类型Point的值。现在 norm 方法获取一个点也将与一个ColouredPoint一起工作,因为它是一个子类型。
注意,变异方法将 not 工作是因为子类型 not 从值扩展到读写指针。实际上,虽然读指针是协变的,但写指针实际上是相反的。
最后要注意的是,显式的子类型强制 supertype 结构是可传递的。