Files
Fig-TreeWalker/docs/zh_CN/06-面对对象.md
2026-02-01 13:59:20 +08:00

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
// ??

使用该模式最好有序构造,如果你清楚你在做什么,完全可以利用它

结构体运算符重载

目前不支持

接口与实现

interfaceimplement

定义接口

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实现