代码将输出
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实现它,它必须是有用的。
答案 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解析器编写补丁。您需要说明为什么此功能有用。