Vala编程语言教程-面向对象编程语基础

发布于:2025-03-23 ⋅ 阅读:(17) ⋅ 点赞:(0)

基础


        尽管Vala语言并不强制你使用对象进行编程,但有些功能只能通过对象的方式来实现。因此,在大多数情况下,你肯定会希望采用面向对象的编程风格。与大多数当前的编程语言一样,为了定义你自己的对象类型,你需要编写一个类定义。
 
        一个类定义说明了该类型的每个对象拥有哪些数据,它可以持有对哪些其他对象类型的引用,以及可以在该对象上执行哪些方法。类定义中可以包含另一个类的名称,表示新定义的类应该是这个类的子类。一个类的实例同时也是它所有超类的实例,因为它从超类继承了所有的方法和数据,尽管它自身可能无法访问所有这些内容。一个类也可以实现任意数量的接口,接口是一组必须由该类实现的方法定义——一个类的实例同时也是其自身类或超类所实现的每个接口的实例。
 
        在Vala语言中,类还可以有“静态”成员。这个修饰符允许将数据或方法定义为属于整个类,而不是属于类的某个特定实例。可以在不拥有类实例的情况下访问这些成员。
 
        一个简单的类可以如下定义:


public class TestClass : GLib.Object {

    /* 字段 */
    public int first_data = 0;
    private int second_data;

    /* 构造函数 */
    public TestClass() {
        this.second_data = 5;
    }

    /* 方法 */
    public int method_1() {
        stdout.printf("private data: %d", this.second_data);
        return this.second_data;
    }
}


         这段代码将定义一个新的类型(该类型会自动在gobject库的类型系统中注册),它包含三个成员。有两个数据成员,即顶部定义的整数,还有一个名为method_1的方法,该方法返回一个整数。类声明表明这个类是GLib.Object的子类,因此它的实例也是Object类型的实例,并且也包含了该类型的所有成员。这个类继承自Object这一事实也意味着Vala语言中有一些特殊功能,可以用来轻松访问Object的一些特性。
 
        这个类被声明为public(默认情况下,类是internal的)。这意味着它可以被这个文件之外的代码直接引用——如果你是使用glib/gobject的C程序员,你会认识到这相当于在一个头文件中定义类接口,其他代码可以包含这个头文件。
 
        类的成员也都被声明为public或private。成员first_data是public的,所以任何使用这个类的用户都可以直接看到它,并且可以在不被包含它的实例察觉的情况下修改它。第二个数据成员是private的,所以只能被属于这个类的代码引用。Vala支持四种不同的访问修饰符:

        ▶public:无访问限制。
        ▶private:访问限制在类/结构体定义内部。如果未指定访问修饰符,这是默认的访问修饰符。
        ▶protected:访问限制在类定义内部以及任何继承自该类的类中。
        ▶internal:访问限制在同一个包中定义的类。
 
        构造函数用于初始化类的新实例。它与类具有相同的名称,可以接受零个或多个参数,并且定义时没有返回类型。
 
        这个类的最后一部分是一个方法定义。这个方法名为method_1,它将返回一个整数。由于这个方法不是静态的,它只能在这个类的实例上执行,因此可以访问该实例的成员。它可以通过this引用做到这一点,this引用始终指向调用该方法的实例。除非存在歧义,否则如果愿意,可以省略this标识符。
 
你可以如下使用这个新类:
 

TestClass t = new TestClass();
t.first_data = 5;
t.method_1();