继承
在 Vala 中,一个类可以继承自 一个或零个 其他类。尽管实际开发中通常继承一个类(不同于 Java 等语言的隐式继承机制),但 Vala 并不强制要求必须继承。
当定义继承自其他类的子类时,子类的实例与父类将形成 **"is-a"** 关系。这意味着:
- 子类实例同时也是父类实例;
- 父类实例支持的操作,子类实例均支持;
- 任何需要父类实例的场景,均可替换为子类实例。
在类定义中,开发者可以 精确控制 对象方法和数据的访问权限。以下示例演示了多种权限修饰符的用法:
cs
class SuperClass : GLib.Object {
private int data;
public SuperClass(int data) {
this.data = data;
}
protected void protected_method() {
}
public static void public_static_method() {
}
}
class SubClass : SuperClass {
public SubClass() {
base(10);
}
}
data是SuperClass的 私有实例成员 ,仅允许SuperClass内部的代码访问;protected_method是SuperClass的 受保护实例方法 ,仅允许SuperClass及其子类的实例调用;public_static_method是SuperClass的 公共静态方法 :static修饰符使其无需实例即可调用(执行时无this引用);public修饰符允许任何代码调用,无论其与SuperClass的关系。
通过上述定义,SubClass 实例将包含 SuperClass 的所有三个成员,但只能访问 非私有成员 (即 protected_method 和 public_static_method)。外部代码仅能访问 public_static_method。
构造函数链式调用 :
子类构造函数可通过 base 关键字调用父类构造函数(如示例中 base(10) 调用了父类的 SuperClass(int data) 构造函数)。