AHK中的面向对象开发基础教程

本文将讲解AutoHotkey中如何使用类Class,即面向对象编程的一些基础知识:

在编程中使用类叫面向对象编程(Object Oriented Programming),希望你已有简单的了解。 “类”是具有相同属性和行为的一类事物。
在类中有两种定义:
-类
-实例

  • 什么是类
    假设你想建造一辆车,你必须有个蓝图。
    这蓝图就是类。在AutoHotkey中是这样的:
Class ClassName{}
  • 什么是实例
    想象你根据蓝图制造了一辆车,这辆车就是实例。
    所以,蓝图是类,汽车是实例。在AutoHotkey创建类的实例是这样的:
InstanceName:=New ClassName

每个类都有变量和方法
- 什么是类的变量
想象你的汽车的名字比如叫BMW,这是个类的变量(属性) 在AutoHotkey中这样表示:

CarName:=BMW

它还有4个轮子,同样也是属性,如是:

WheelsAmount:= 4
  • 什么是类的方法
    想象一下当你打方向盘时汽车会转向,这是个方法,在AutoHotkey里看起来是这样的:
TurnSteerWheel()

同样,你使用车钥匙解锁车,这也是类的方法:

CarOpenKey()

想象一下,你拟定了蓝图,里面有所有的变量何方法的定义,现在你想建造一个汽车,在AutoHotkey中就是这样的:

;首先,我们要声明一个类:
Class Car{CarName:="BMW"
WheelsAmount:=4
TurnSteerWheel()
{
Some Commands here...
}
CarOpenKey(){
Some Commands here...
}
}
; 然后创建一个类的实例起名叫BMWConcept
BMWConcept:=New Car

这是非常基础的,让我们用AutoHotkey来创建一些类。
来创建一个简单的窗口类。窗口有很多属性:窗口的标题、窗口ID、位置、大小等等这些是类的变量。
我们还可以让窗口有许多动作,比如:激活它、获取标题、获取它的位置等等动作,这些就是类的方法。
我们简单的创建一个记事本窗口类,只有一个变量和一个方法:

#SingleInstance force;Declare Class声明类
Class Window{
Title:="Untitled - Notepad";Variable Title 标题是一个类变量
Activate();Activates window with Title - This.Title 激活窗口是类方法
{IfWinExist, % This.TitleWinActivateelseMsgBox % "There is no Window: "This.Title "`nPleas Run Notepad!"}
};Create Instance创建类实例
SomeWin:=New Window
Return!^a::;Hotkey to run Instance Method
SomeWin.Activate()
Return

现在呢,我们创建一个方法方便我们自动获得窗口的属性 ,还有一些其它方法。


#SingleInstance force;Declare Class声明类
Class Window{Get()
{WingetTitle TitleVar, A ; Get title from Active window.从激活的窗口得到标题This.Title:=TitleVar ; Set TitleVar to This.Title将Title设置为TitleVarWinGet IDVar,ID,A ; Get ID from Active window.从激活窗口获得窗口IDThis.ID:=IDVar ; Set IDVar to This.ID将ID设置为IDVar
}
Activate();Activates window with Title - This.Title
{;MsgBox % This.IDWinActivate % "ahk_id "This.ID ;Use word "This" when you reffer to    variable of this Class.当你引用类变量需要用This.Return This.ID
}
AnnounceWinProps();Create message box with title and ID创建一个对话框显示标题和ID
{MsgBox % "Title is: "This.Title "`n ID is: "This.ID
}
}
;Create Instance创建类的实例
SomeWin:=New Window
return^!a::;Hotkey to run Instance Method热键来调用实例方法IfWinExist, ahk_class NotepadWinActivate ahk_class Notepad
else{MsgBox % "There is no Window: Notepad.`nPleas Run Notepad!"exit}SomeWin.get()
SomeWin.AnnounceWinProps()
Return^!s::
If SomeWin.IDSomeWin.Activate()
elseMsgBox Instance SomeWindow has no ID setted, pleas run SomeWin.get() first!
return
  • 添加了什么
    1.添加了get()方法,该方法从当前激活的窗口返回窗口标题和窗口ID
    2.移除了类变量Title,因为我们可以使用get()获取到标题信息
    3.修改了Activate方法,现在使用的不是窗口标题而是窗口ID
    4.增加了AnnounceWinProps()方法,它将输出Title和ID(由get方法返回的)
    5.修改了热键^!a,新版本是先激活Notepad,然后运行get方法。
    6.增加乐热键^!s,这个热键是用方法Activate()来激活窗口,如果ID是True(也就是有返回值情况)

现在让我们用嵌套类给这个类添加两个变量。
- 什么是嵌套类
嵌套类就是一个类在另一个类里面。

#SingleInstance force;Declare Class
Class Window{Class Tmp{A:=1Static B:=1}Get(){WingetTitle TitleVar, A ; Get title from Active window.This.Title:=TitleVar ; Set TitleVar to This.TitleWinGet IDVar,ID,A ; Get ID from Active window.This.ID:=IDVar ; Set IDVar to This.ID}Activate() ;Activates window with Title - This.Title{ IfWinExist, % "ahk_id "This.IDWinActivate % "ahk_id " This.IDelseMsgBox % "There is no Window with ID: "This.ID}  AnnounceWinProps() ;Create message box with title and ID{MsgBox % "Title is: " This.Title "`n ID is: " This.ID}
}
;Create Instance
SomeWin:= New Window
return^!a:: ;Hotkey to run Instance Method
WinActivate ahk_class Notepad
SomeWin.get()
SomeWin.AnnounceWinProps()
Return^!s::
If SomeWin.IDSomeWin.Activate()
elseMsgBox Instance SomeWindow has no ID setted, pleas run SomeWin.get() first!
return^!d::
MsgBox % "SomeWin.Tmp.A = "SomeWin.Tmp.A "`nSomeWin.Tmp.B = "SomeWin.Tmp.B
return

上面可以看到,可以像这样访问嵌套类中的变量:

BaseClass.NestedClass.Var 

也可以像这样访问嵌套类中的方法:

BaseClass.NestedClass.Method()

现在,如果你按下 “^!d”,您将看到消息 SomeWin.Tmp.A = Nothing. 为什么?
让我们看我们的变量声明:

Class Tmp{A:=1Static B:=1
}

正如你所看到的这样,一个简单声明变量,这种变量——实例变量。 实例变量 是类的每个实例都拥有独立的副本(实例是从类派生的每个对象)。 他们如同普通赋值一样被声明。实例变量仅在实例创建时分配给实例。 我们要用嵌套类Window.Tmp创建实例,需要如下所示:SomeWin1:= New Window.Tmp。 创建实例后,变量A才可用:SomeWin1.A
我们转到变量B,它前面有“Static”关键字,这种变量 ——静态变量(也可以叫类变量区别于实例变量)。 这个变量属于类本身,所以这就是为什么我们可以访问它,弹出的消息框也的确显示B=1。
现在我们来讨论类继承。
-什么是类继承
想象你有类A,它有Var1和Var2。 您创建了B类,并且您希望此类从A派生所有内容。即具有与A类相同的变量和方法。
我们如下创建它:

Class A{Static Var1:=1Static Var2:=2
}Class B extends A{Var3:=3
}NewClass:= New B
MsgBox % "Var1=" NewClass.Var1 "`nVar2=" NewClass.Var2 "`nVar3=" NewClass.Var3
return

你可以看到Class B从A类继承所有内容并添加自己的实例变量 Var3。
这叫类继承。

让我们回到我们的记事本项目。 让我们创建一个新的Notepad类,并使它从Window类继承所有内容,并添加一些新的方法。

#SingleInstance force;Declare Class
Class Window{Class Tmp{A:=1Static B:=1}Get(){WingetTitle TitleVar, A ; Get title from Active window.This.Title:=TitleVar ; Set TitleVar to This.TitleWinGet IDVar,ID,A ; Get ID from Active window.This.ID:=IDVar ; Set IDVar to This.ID}Activate() ;Activates window with Title - This.Title{ IfWinExist, % "ahk_id "This.IDWinActivate % "ahk_id " This.IDelseMsgBox % "There is no Window with ID: "This.ID}  AnnounceWinProps() ;Create message box with title and ID{MsgBox % "Title is: " This.Title "`n ID is: " This.ID}
}Class Notepad extends Window{Run(){IfWinNotExist ahk_class NotepadRun NotepadElse WinActivate}
};Create Instance
SomeWin:= New Window
SomeNot:= New Notepad
return^!a:: ;Hotkey to run Instance Method
SomeNot.Run()
SomeNot.get()
SomeNot.AnnounceWinProps()
Return^!s::
If SomeWin.IDSomeWin.Activate()
elseMsgBox Instance SomeWindow has no ID setted, pleas run SomeWin.get() first!
return^!d::
MsgBox % "SomeWin.Tmp.A = "SomeWin.Tmp.A "`nSomeWin.Tmp.B = "SomeWin.Tmp.B
return

您可以看到我们添加了一个新类Notepad,它扩展自类Window,并创建一个Notepad类的实例SomeNot。

还要看看热键 ^!a 您可以看到实例SomeNote使用类Window中的所有继承的方法。

最后…
假设创建实例时,我们需要一些动作。 初始化那些动作我们将使用:__New函数,下面是它的用法:

Class A{__New(){Some commands here...   }
}

再回到我们的脚本,这是现在Notepad 类的样子:

#SingleInstance force;Declare Class
Class Window{Class Tmp{A:=1Static B:=1}Get(){WingetTitle TitleVar, A ; Get title from Active window.This.Title:=TitleVar ; Set TitleVar to This.TitleWinGet IDVar,ID,A ; Get ID from Active window.This.ID:=IDVar ; Set IDVar to This.ID}Activate() ;Activates window with Title - This.Title{ IfWinExist, % "ahk_id "This.IDWinActivate % "ahk_id " This.IDelseMsgBox % "There is no Window with ID: "This.ID}  AnnounceWinProps() ;Create message box with title and ID{MsgBox % "Title is: " This.Title "`n ID is: " This.ID}
}Class Notepad extends Window{__New(){   This.Run()This.get()}Run(){IfWinNotExist ahk_class NotepadRun NotepadElse WinActivate}   }
;Create Instance
SomeWin:= New Window
SomeNot:= New Notepad
return^!a:: ;Hotkey to run Instance Method
;SomeNot.Run()
;SomeNot.get()
;SomeNot.AnnounceWinProps()
Return^!s::
If SomeNot.IDSomeNot.Activate()
elseMsgBox Instance SomeWindow has no ID setted, pleas run SomeWin.get() first!
return^!d::
MsgBox % "SomeWin.Tmp.A = "SomeWin.Tmp.A "`nSomeWin.Tmp.B = "SomeWin.Tmp.B
return

你可以看到__New函数被添加在记事本类中。这段代码
使得创建SomeNot实例时,它执行方法Run()和Get()
现在我们不需要从热键运行它们,看热键^!a ::,我们不再需要那些动作了。 现在我们可以直接用^!s来激活记事本了。

还有个__Del函数,类似__New函数它可以在实例删除时起作用,这里就不细讲了。

让我们做最后的再体会下,我们来创建Calc类,继承自Window类,我们还会添加到它的Run( )方法。

#SingleInstance force;Declare Class
Class Window{Class Tmp{A:=1Static B:=1}Get(){WingetTitle TitleVar, A ; Get title from Active window.This.Title:=TitleVar ; Set TitleVar to This.TitleWinGet IDVar,ID,A ; Get ID from Active window.This.ID:=IDVar ; Set IDVar to This.ID}Activate() ;Activates window with Title - This.Title{ IfWinExist, % "ahk_id "This.IDWinActivate % "ahk_id " This.IDelseMsgBox % "There is no Window with ID: "This.ID}  AnnounceWinProps() ;Create message box with title and ID{MsgBox % "Title is: " This.Title "`n ID is: " This.ID}
}Class Notepad extends Window{__New(){   This.Run()This.get()}Run(){IfWinNotExist ahk_class NotepadRun NotepadElse WinActivate}   }Class Calc extends Window{__New(){   This.Run()This.get()}Run(){IfWinNotExist ahk_class CalcFrameRun CalcElse WinActivate}   }
;Create Instance
SomeWin:= New Window
SomeNot:= New Notepad
SomeCalc:= New Calc
return^!a:: ;Hotkey to run Instance Method
;SomeNot.Run()
;SomeNot.get()
;SomeNot.AnnounceWinProps()
Return^!s::
If SomeNot.IDSomeNot.Activate()
elseMsgBox Instance SomeWindow has no ID setted, pleas run SomeWin.get() first!
return^!d::
If SomeCalc.IDSomeCalc.Activate()
elseMsgBox Instance SomeWindow has no ID setted, pleas run SomeWin.get() first!
return

正如你所看到的,我们添加了Run( )方法,所以现在当我们创建实例SomeCalc时,会启动计算器。

希望这些基础,能让你学会使用AHK的类。
英文好的请猛戳

[AHK]面向对象开发基础教程相关推荐

  1. iPhone 开发基础教程

    Phone 开发基础教程之 在开始编写iPhone软件之前,需要做一些准备工作.对于初学者,需要一台运行Leopard(OS X 10.5.3或更高版本)的基于Intel的Macintosh计算机.2 ...

  2. Xamarin图表开发基础教程(13)OxyPlot框架支持的其它图表

    Xamarin图表开发基础教程(13)OxyPlot框架支持的其它图表 除了以上提到的图表外,OxyPlot组件还包含了6种类型的其它图表,分别为等高线图.箱线图.饼图.热图.散点图和散点误差图,如图 ...

  3. Xamarin图表开发基础教程(12)OxyPlot框架支持的金融图表类型

    Xamarin图表开发基础教程(12)OxyPlot框架支持的金融图表类型 OxyPlot组件中支持5种类型的金融图表,它们分别为销量图.高低图.股票K线图.股票走势图和旧式股票图,如图1.20~1. ...

  4. Xamarin图表开发基础教程(11)OxyPlot框架支持的图表类型

    Xamarin图表开发基础教程(11)OxyPlot框架支持的图表类型 OxyPlot组件中支持7种类型的条型图表,分别为普通条形图.线型条形图.矩形条形图.差值图.龙卷风图.普通柱形图和柱形误差图, ...

  5. Xamarin图表开发基础教程(10)OxyPlot框架支持的图表类型

    Xamarin图表开发基础教程(10)OxyPlot框架支持的图表类型 OxyPlot组件支持26种图表,这些图表按照功能和样式可以分为4大类,分别为线型图表.条型图表.金融图表和其它图表. 线型图表 ...

  6. Xamarin图表开发基础教程(8)OxyPlot框架

    Xamarin图表开发基础教程(8)OxyPlot框架 [示例OxyPlotFormsDemo]在Xamarin.Forms中实现线图的显示. (1)打开Xamarin.Forms项目. (2)将Ox ...

  7. Xamarin图表开发基础教程(7)OxyPlot框架

    Xamarin图表开发基础教程(7)OxyPlot框架 Xamarin.Forms中使用OxyPlot框架 在Xamarin. Forms平台上实现图表显示需要完成以下的步骤: 1.添加OxyPlot ...

  8. Xamarin图表开发基础教程(6)OxyPlot框架

    Xamarin图表开发基础教程(6)OxyPlot框架 Xamamin iOS中绘制线图OxyPlotiOSDemo [示例OxyPlotiOSDemo]下面将实现线图的显示.具体的操作步骤如下: ( ...

  9. Xamarin图表开发基础教程(5)OxyPlot框架

    Xamarin图表开发基础教程(5)OxyPlot框架 Xamarin.iOS中使用OxyPlot框架 在Xamarin.iOS平台上实现图表显示需要完成以下的步骤: 1.添加OxyPlot.Xama ...

最新文章

  1. 软件系统非功能测试方法,非功能测试方案模板
  2. 敏捷个人教你如何制作2012生活看板
  3. Wi-Fi速度慢的十个原因以及解决办法
  4. Java Web 编程入门知识
  5. 用vim看代码的常用指令
  6. ABAP很厉害是怎么一种体验?
  7. 无法载入 mysql 扩展
  8. .NET Core 3.1 编写混合 C++ 程序
  9. jcmd:一个可以全部统治的JDK命令行工具
  10. sql server的密码采用自带什么密码技术存储_【技术分享】浅谈MYSQL 8.0新特性
  11. 深入了解自动化测试方案
  12. web网页 页面布局的几种方式(转)
  13. [Canvas]空战游戏进阶 增加发射子弹 敌机中弹爆炸功能
  14. 小米无线显示与电脑连接到服务器,小米手机和电脑进行怎么无线连接
  15. TCP/IP重传超时--RTO - SRTT (Smoothed Round Trip Time)
  16. 【一年总结】我的大三
  17. 开源农业SaaS系统(Version:2.0.1)包含源代码
  18. 【五一创作】使用Scala二次开发Spark3.3.0实现对MySQL的upsert操作
  19. XiaoHu日志 9/7~9/17
  20. 光脚丫学LINQ(006):投影

热门文章

  1. 工作中提高效率:高效能的七个习惯的实践
  2. 【难学易用c++ 之 继承】
  3. 《Linux那些事儿之我是USB》我是U盘(4)想到达明天现在就要启程
  4. Tubi 继续“大小周”!
  5. 11.17-判断一个数是质数还是合数
  6. LeetCode每日一题--649. Dota2 参议院(贪心 队列)
  7. LAM 的安装和配置
  8. 链家网北京市租房数据分析(一)——基于python的数据清洗
  9. rtx4000显卡什么级别 rtx4000显卡属于哪个级别
  10. CSP 201912-3 化学方程式 100分