物体

基本建设

Felix提供了一个动态的对象构造机制。

object ob (x:string) = {
    var age = 0;
    method fun name () => x;
    method fun underage () => age < 21;
    method proc setage (y:int) { age = y; }
 };
 var joe = ob "joe";
 joe.setage 42;
 println$ "name " + joe.name() + " is " +
   if joe.underage()
   then "underage"
   else "of age"
   endif
 ;

在这里, ob 是一个具有一个特殊属性的普通函数:返回是自动完成的,返回值是指定为的函数和过程的闭包记录 method . 它们在 构造函数 功能 ob .

应用对象构造函数 ob 与参数匹配的参数 x 创建实际对象,它是一个普通的记录值。

对象类型

上述对象的类型由以下公式给出:

typedef ob_t =
(
  name: 1->string,
  underage: 1->bool,
  setage: int -> 0
);

另一种语法是:

interface ob_t  {
  name: 1->string;
  underage: 1->bool;
  setage: int -> 0;
};

您可以使用它来指定构造函数的返回类型:

object ob (x:string) implements ob_t = {
    var age = 0;
    method fun name () => x;
    method fun underage () => age < 21;
    method proc setage (y:int) { age = y; }
 };

力学

Felix对象比java或C++更灵活,因为它们不是由类定义的,它们只是由函数构造的值。事实上,你可以用一个普通的函数构造一个对象:唯一的魔法是 object 绑定函数是自动返回 method 关闭。

因为实例对象只是一个记录,所以您可以对它应用任何记录操作!

但是,方法闭包绑定到的构造函数的局部变量受函数抽象的保护,因此可以认为是私有的。这种隐私是无法绕过的。

但你可以这样做:

var joe = ob "joe";
joe = (joe with name = (fun () => "Joe")); // change name method
println$  "name " + joe.name(); // prints Joe not joe

var xjoe = extend joe with (surname = "Blogs") end;
println$ xjoe.surname;

注意,类型 xjoe 不再相同,它有一个额外的字段名为 surname . 这个字段只是一个字符串,不是一个方法。