以下是我要做的事情的基本结构:
OutputDebug % "~~~~~ START ~~~~~"
tempA := new ClassA()
tempB := new ClassB()
tempC := new ClassC()
tempA := 0
tempB := 0
tempC := 0
OutputDebug % "~~~~~ END ~~~~~"
return
class Base {
ivar := 0
__New(inValue) {
this.ivar := new Debug(inValue)
}
__Delete() {
this.ivar := 0
}
}
class Debug {
value := 0
__New(inValue) {
this.value := inValue
OutputDebug % "Create Debug [" this.value "]"
}
__Delete() {
OutputDebug % "Delete Debug [" this.value "]"
}
}
class ClassA extends Base {
__New() {
base.__New("A")
OutputDebug % "Create ClassA"
}
__Delete() {
base.__Delete()
OutputDebug % "Delete ClassA"
}
}
class ClassB extends Base {
__New() {
base.__New("B")
OutputDebug % "Create ClassB"
}
__Delete() {
base.__Delete()
OutputDebug % "Delete ClassB"
}
}
class ClassC extends Base {
__New() {
base.__New("C")
OutputDebug % "Create ClassC"
}
__Delete() {
base.__Delete()
OutputDebug % "Delete ClassC"
}
}
运行此命令时,我在调试日志中得到以下输出:
Create Debug [A]
Create ClassA
Create Debug [B]
Delete Debug [A]
Create ClassB
Create Debug [C]
Delete Debug [B]
Create ClassC
Delete Debug [C]
Delete ClassA
Delete ClassB
Delete ClassC
然而,这不是我所期望的......这是我正在寻找的输出:
Create Debug [A]
Create ClassA
Create Debug [B]
Create ClassB
Create Debug [C]
Create ClassC
Delete Debug [A]
Delete ClassA
Delete Debug [B]
Delete ClassB
Delete Debug [C]
Delete ClassC
我正在使用Notepad ++,我已经安装了DBGp插件,它可以工作,我可以逐步完成脚本......问题似乎与类'Base'被实例化为Class [ABC]的基础时有关。当它到达'ivar:= 0'行时,它实际上是删除了前一个对象......如果它是一个类变量,那么这将是有意义的,但不是作为实例变量!
我从根本上不了解AHK如何上课? :(
答案 0 :(得分:4)
这个问题的解决方案非常简单。
不要在关键字后命名您的课程! AutoHotkey中的变量不区分大小写,所以' Base'与' base'相同。
因此当我使用' base'它把它当作“基地”来对待,这就是我对“伊莎”的观察。表现得像一个类变量是真的......因为它是在不经意间以这种方式使用的!
如果您重命名班级' Base'在上面的示例代码中,' BaseX'一切都按预期工作!
在AHK论坛上,AHK的创建者也在那里回复了我的问题:
base only has special meaning if followed by a dot . or brackets [], so
code like obj := base, obj.Method() will not work. Scripts can disable the
special behaviour of base by assigning it a non-empty value; however, this
is not recommended. Since the variable base must be empty, performance may
be reduced if the script omits #NoEnv.
来源:Objects
这部分是为了向后兼容使用" base"作为变量名称(在它成为"关键字"之前),部分原因在于它的实现方式。您可能会注意到ListVars显示base [0 of 0]: - 它由默认基础对象实现,条件是目标是名为base的空变量。因此,可以这样做:
class Base {
M() {
MsgBox % A_ThisFunc
}
}
class C extends Base {
M() {
local base
MsgBox % A_ThisFunc
base.M()
}
}
C.M()
您可以通过向默认基础对象添加__call元函数来自行挂接base.Method()(其中base不是对象),但在脚本中您无法获取目标变量的名称。