精灵的类构造

时间:2016-01-10 13:41:57

标签: constructor vala genie

代码将输出

1
2
2

1 仅打印一次。我不知道,如何用精灵写出来。

下面的

是vala代码:

public static void main() {
    var a = new One();
    var b = new One();
}

class One : Object {
    class construct {
        stdout.puts("1\n");
    }
    public One () {
        stdout.puts("2\n");
    }
}

精灵的等效代码类构造方法是什么?

如果是Genie的初学者? (现在)它与vala的类构造不同吗?

Genie的初学

下面的

无效!

init
    var a = new One
    var b = new One

class One
    construct ()
        stdout.puts("2\n")
    init
        stdout.puts("1\n")
  
    

构造块需要GLib.object

         

构造块=> init块

  

但是Vala的类构造不会。

所以vala会起作用,但是Genie不会,

vala代码:

class One {
    class construct {
        stdout.puts("1\n");
    }
    public One () {
        stdout.puts("2\n");
    }
}

为什么此功能有用? 实际上我以前从不使用。 但我认为这很有用,非常有用。

示例:初始化一些静态文件(或类字段:另一个问题)。

我不知道为什么?为什么Vala实现此功能? 如果Vala实现它,它必须是有用的。

1 个答案:

答案 0 :(得分:2)

从我认为是init的文档中我能说出什么。虽然我不确定你为什么要使用它。它可能对于在类的所有实例中使用的一些延迟加载静态数据很有用,但我自己从未这样做过。

在面向对象的编程术语中,当一个类被创建为一个对象时,它就会被“实例化”。可以使用“构造函数”自定义实例化的过程。在Vala和Genie中,当“析构函数”不再需要对象时,也可以自定义过程。

如果方法不对对象中的数据起作用,则称为static方法。根据定义,构造函数不会对对象中的数据执行操作,而是返回一个新对象。因此构造函数始终是静态的,static construct是错误的名称。在Vala中有class construct,如果您更改要使用的代码,则会得到相同的结果。有关Vala中此主题的全面处理,请参阅Vala different type of constructors。关于class construct的部分就在最后。

我的理解是Genie的init相当于Vala的class construct。我认为你的问题在Genie中发现了一个问题。我的理解是这段代码会回答你的问题:

[indent = 4]
init
    var a = new One()
    var b = new One()
    var c = new One.alternative_constructor()

class One:Object
    init
        print "Class 'One' is registered with GType"

    construct()
        print "Object of type 'One' created"

    construct alternative_constructor()
        print """Obect of type 'One' created with named constructor
'alternative_constructor', but the design of your
class is probably too complex if it has multiple
constructors."""

    def One()
        print "This is not a constructor"

    final
        print "Object of type 'One' destroyed"

然而,这会产生:

Class 'One' is registered with GType
Object of type 'One' created
Class 'One' is registered with GType
Object of type 'One' created
Class 'One' is registered with GType
Obect of type 'One' created with named constructor 
'alternative_constructor', but the design of your 
class is probably too complex if it has multiple 
constructors.
Object of type 'One' destroyed
Object of type 'One' destroyed
Object of type 'One' destroyed

而GType的注册只发生一次,因此init代码放在错误的位置,并且每次实例化都不会使用类型注册进行调用。因此,目前我认为Genie中没有相当于Vala的class construct

改变init的行为可能是一种解决方案,但我可能误解了它的最初目的,现在可能有很多代码依赖于它的当前行为。另一种解决方案是为实现此功能的Genie解析器编写补丁。您需要说明为什么此功能有用。