Vala 编程语言教程-多态

多态性

多态性基础

        多态性指‌同一对象可被视作多种类型使用‌的能力。在 Vala 中,子类实例可被当作父类或接口类型操作,但通过虚方法机制可实现‌运行时动态行为绑定‌。


虚方法的作用

未使用虚方法(静态绑定)

class SuperClass : GLib.Object {
    public void method_1() {
        stdout.printf("SuperClass.method_1()\n");
    }
}

class SubClass : SuperClass {
    public void method_1() {  // 隐藏父类方法(非覆盖)
        stdout.printf("SubClass.method_1()\n");
    }
}

// 使用示例
SubClass o1 = new SubClass();
o1.method_1();                // 输出 SubClass.method_1()
SuperClass o2 = o1;
o2.method_1();                // 输出 SuperClass.method_1() ❌ 未实现多态
  • 问题‌:通过父类引用调用方法时,始终执行父类实现,无法体现子类特性。

使用虚方法(动态绑定)

class SuperClass : GLib.Object {
    public virtual void method_1() {  // 声明为虚方法
        stdout.printf("SuperClass.method_1()\n");
    }
}

class SubClass : SuperClass {
    public override void method_1() { // 覆盖虚方法
        stdout.printf("SubClass.method_1()\n");
    }
}

// 使用示例
SubClass o1 = new SubClass();
o1.method_1();                // 输出 SubClass.method_1()
SuperClass o2 = o1;
o2.method_1();                // 输出 SubClass.method_1() ✅ 多态生效
  • 关键点‌:虚方法通过 virtual 和 override 实现‌运行时类型识别‌,确保调用实际子类逻辑。

抽象方法与虚方法的关系

  • 所有抽象方法‌隐式声明为虚方法‌(必须允许子类覆盖)
  • 实现抽象方法时需使用 override,并保持其虚方法特性
public abstract class Animal : GLib.Object {
    public abstract void make_sound();  // 隐式 virtual
}

public class Dog : Animal {
    public override void make_sound() {  // 覆盖并保持 virtual
        stdout.printf("Woof!\n");
    }
}

调用基类实现

通过 base 关键字可在子类中访问父类方法:

public class SubClass : SuperClass {
    public override void method_1() {
        base.method_1();       // 调用父类实现
        stdout.printf("扩展逻辑\n");
    }
}

虚属性

属性也可声明为虚方法,实现多态行为:

class SuperClass : GLib.Object {
    public virtual string prop_1 {  // 虚属性
        get {
            return "SuperClass.prop_1";
        }
    }
}

class SubClass : SuperClass {
    public override string prop_1 {  // 覆盖属性
        get {
            return "SubClass.prop_1";
        }
    }
}

// 使用示例
SuperClass obj = new SubClass();
stdout.printf("%s\n", obj.prop_1);  // 输出 SubClass.prop_1 ✅

核心机制对比

场景 行为
普通方法 编译时静态绑定,引用类型决定调用版本
虚方法 (virtual) 运行时动态绑定,实际对象类型决定调用版本
抽象方法 必须为虚方法,强制子类实现
属性覆盖 需严格匹配签名,虚属性实现多态存取

多态性设计原则

  1. 开放扩展‌:通过虚方法允许子类定制行为
  2. 类型透明‌:父类引用操作子类对象时,自动调用最新实现
  3. 基类控制‌:使用 base 保留父类核心逻辑,子类仅扩展新增功能

        Vala 通过虚方法机制实现了类似 C++/C# 的多态模型,与 Java 的「默认虚方法」机制形成对比。开发者需显式使用 virtual 和 override 来控制多态行为,兼顾灵活性与安全性。

你可能感兴趣的:(vala,教程,c#,开发语言,c语言,c++,后端)