为什么我的实例变量在AHK中表现得像一个类变量?

时间:2016-08-26 02:52:28

标签: autohotkey instantiation instance-variables base-class

以下是我要做的事情的基本结构:

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如何上课? :(

1 个答案:

答案 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不是对象),但在脚本中您无法获取目标变量的名称。