跳到主要内容
版本:release

访问权限

GS 支持 private, protectedpublic 三种访问权限修饰符;只有对象的方法和 class 的成员 变量和成员方法可以被访问权限修饰符修饰。

访问权限的含义

对象方法

如果一个对象的方法被修饰为:

  • private: 只能在当前脚本文件中被直接调用
// a.gs
private void foo()
{
// ...
}
foo(); // Ok

// b.gs
component a;
// foo(); // error, 不能跨脚本文件调用 private 方法
  • protected: 只能在当前对象和组合此脚本的对象中被直接调用
// a.gs
protected void foo()
{
// ...
}
foo(); // Ok

// b.gs
component a;
foo(); // Ok
  • public: 可以被直接调用,也可以作为对象对外公开的方法被调用
// a.gs
public void foo()
{
// ...
}
foo(); // Ok
// b.gs
import a;

object aa = new_object(a);
aa.foo(); // Ok

class 成员变量和成员方法

class_map 中的成员变量和方法的默认访问权限是 public,如果一个 class 的成员变量或成员方法被修饰为:

  • private: 只能在当前类的方法内访问,并且必须从类型明确的实例访问
  • protected: 只能在当前类和子类的方法内访问,并且必须从类型明确的实例访问
  • public: 可以在任何地方访问,并且可以从类型不明确的实例访问
class A
{
private int member = 15;
protected int member2 = 15;
int member3 = 15;

void foo(A self)
{
writeln(self.member); // Ok
writeln(self.member2); // Ok
writeln(self.member3); // Ok

mixed m = self;
// writeln(m.member); // error,运行时提示无法找到字段
// writeln(m.member2); // error,运行时提示无法找到字段
writeln(m.member3); // Ok
}
}

A a = new A();
a.foo(a); // Ok
// writeln(a.member); // error
// writeln(a.member2); // error
writeln(a.member3); // Ok

访问权限的检查

对于类型明确的情况,访问权限将在编译期完成检查,并给出编译错误;反之,在运行时进行检查。