forked from PuqiAR/Fig-TreeWalker
2.1 KiB
2.1 KiB
面对对象
Fig中只有结构体(
struct) 遵循go圣经 组合由于继承 (struct组合尚未推出)
结构体定义
完整语法:
struct Point
{
public x: Int; // 公开字段
public y: Int; // 公开字段
}
struct Person
{
name: String; // 私有字段,无法被外部访问
age: Int; // 私有字段,无法被外部访问
sex: String = "Airplane"; // 私有字段,无法被外部访问
public func getName() -> String // 公开类函数
{
return name;
}
}
结构体初始化
语法:
// 位置参数构造
var person := new Person{
"Fig", // name
1, // age
"Language" // sex
};
// 命名参数构造模式,可以无序
var person := new Person{
name: "Fig",
age: 1,
sex: "Language"
};
// 语法糖:同名变量构造
const name := "Fig";
const age := 1;
const sex := "Language";
var person := new Person{sex, name, age}; // 可以无序,自动匹配
请注意,同名变量构造(shorthand)模式请规范使用: 示例:定义
struct Point
{
public x;
public y;
}
使用:
var a := Point{1,2};
io.println(a.x, a.y); // 1 2
var x := 7;
var y := 6;
var b := Point{y, x};
io.println(b.x, b.y); // 7 6
// ??
使用该模式最好有序构造,如果你清楚你在做什么,完全可以利用它
结构体运算符重载
目前不支持
接口与实现
interface 与 implement
定义接口
interface Printable
{
toString() -> String;
getName() -> String
{
return "Printable";
}
}
使用 interface + 名字 {内容}定义结构体
方法签名为 method() -> type,其中必须提供返回类型,这是约定。
提供默认方法将在子类实现为实现情况下自动替补
实现
struct Person
{
name: String;
age: Int;
}
impl Printable for Person
{
toString()
{
return name + ":" + age;
}
getName()
{
return "Person";
}
}
实现时不需要也不允许提供返回类型,必须与interface约定一致
内部通过动态派发 vtable实现