You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

你之前写法的问题说明

  1. 初始代码问题:子类的__New没有调用父类构造函数,导致父类的name、age属性完全不会被初始化,实例化后这些属性不存在。
  2. 第二种尝试的问题:在子类中重复编写name、age的赋值逻辑,违背了继承的复用原则,Define方法属于冗余代码,直接调用父类构造即可完成属性初始化。

内容的提问来源于stack exchange,提问作者UnusualSoul

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 23:25:13