2016-10-16 48 views
1

我看过https://wiki.gnome.org/Projects/Vala/Manual/Classes#Types_of_class_members并进行了多次测试。作为结果,我相信这班级成员与Vala中的静态成员

静态成员:可以在一个类可以访问它&子类&所有这些
类成员的实例:在访问的所有实例(一类&子它的类)

这是正确的吗?还有其他的区别吗?

public class Test { 
    public static int static_member; 
    public class int class_member; 
    public int instance_member; 
} 

在编译时会产生这些C数据结构(我只展示的重要组成部分):

struct _Test { 
     gint instance_member; 
}; 

struct _TestClass { 
     gint class_member; 
}; 

extern gint test_static_member; 

静态成员是使用--ccode开关瓦拉编译

+0

不知道Vala。在其他语言中,静态方法就像函数(它们没有任何状态),非静态方法在类的实例上工作。 – user5055454

+0

使用变量:static就像一个类变量(所有实例共享它+可以在没有实例的情况下访问它)。 – user5055454

+0

我也了解java,c#等语言。 vala中的概念是静态成员。 AFAIK类成员像实例成员一样工作(例如不能执行'Foo.class_func();'使'访问实例成员'错误),除了类成员将在类范围内执行,不能是'虚拟',等等 –

回答

2

让我们检查不存储在属于该类的任何结构中,而是一个全局变量。它仍然使用类前缀作用域(所以前缀“test_”)以避免与其他全局变量或其他类的静态成员发生名称冲突。

类成员存储在“类结构”中,实例成员存储在“实例结构”中。

“类结构”可以通过派生类进行扩展,但除此之外,每个类通常只有一个“类结构”实例(这就是为什么它们是这样命名的原因)。

“实例结构”在每次创建新实例时都保存所有实例数据。

为了全面了解这些机制,您必须了解一些C并且必须阅读GObject手册。