物体
基本建设
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 . 这个字段只是一个字符串,不是一个方法。