AHK V2类继承问题求助:子类如何继承父类属性
AutoHotkey V2 子类继承父类时正确初始化父类属性的方案
在AutoHotkey V2的类继承中,子类必须显式调用父类的__New构造函数,才能让父类完成自身属性的初始化,同时避免重复编写属性赋值逻辑。针对你的需求,这里提供两种简洁的实现方案:
方案一:通过对象传递父类参数
沿用你最初的父类设计,子类构造时先将包含name、age的对象传给父类构造,再处理自身独有的属性:
Class Person{ __New(info){ this.name := info.name this.age := info.age } } Class Teacher extends Person{ __New(info, subject){ ; 调用父类构造,初始化name和age super.__New(info) this.subject := subject } } Class Student extends Person{ __New(info, deskLocation){ super.__New(info) this.deskLocation := deskLocation } } ; 实例化示例 T1 := Teacher({name: "王老师", age: 35}, "gym") S1 := Student({name: "小明", age: 12}, 11) ; 验证属性 MsgBox T1.name " | " T1.age " | " T1.subject MsgBox S1.name " | " S1.age " | " S1.deskLocation
方案二:拆分参数传递
如果参数数量不多,直接拆分name、age作为独立参数传递给父类构造,写法更直观:
Class Person{ __New(name, age){ this.name := name this.age := age } } Class Teacher extends Person{ __New(name, age, subject){ super.__New(name, age) this.subject := subject } } Class Student extends Person{ __New(name, age, deskLocation){ super.__New(name, age) this.deskLocation := deskLocation } } ; 实例化示例 T1 := Teacher("王老师", 35, "gym") S1 := Student("小明", 12, 11) ; 验证属性 MsgBox T1.name " | " T1.age " | " T1.subject MsgBox S1.name " | " S1.age " | " S1.deskLocation
你之前写法的问题说明
- 初始代码问题:子类的
__New没有调用父类构造函数,导致父类的name、age属性完全不会被初始化,实例化后这些属性不存在。 - 第二种尝试的问题:在子类中重复编写name、age的赋值逻辑,违背了继承的复用原则,
Define方法属于冗余代码,直接调用父类构造即可完成属性初始化。
内容的提问来源于stack exchange,提问作者UnusualSoul
相关产品推荐
相关产品推荐

