结构子类型

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 结构是可传递的。