使用

# 构造器

类实例化对象时,构造函数将自动执行。 构造函数用于初始化对象内部变量。

如果不显式声明构造函数,则会自动创建缺省的构造函数初始化变量。 不显示的默认构造函数。

在上一章中声明的CIndicator类中,我们手动创建了构造函数。 名字依然是CIndicator ()。 也就是说,我们的构造函数必须与类名相同。

构造函数不需要指定返回类型。 返回类型始终为void。 访问级别为公共。

紧凑的CIndicator构造函数如下:

类别指示器

{

公共:

指示器(;

//.

(; 以下示例显式声明构造函数。 只需将main[]数组存储为序列值。

是指示器:3360指示器(void )

{

阵列集系列(主,真);

{1}不需要生成器,也不需要创建,请记住系统已经准备好了。

构造函数还可以使其他构造函数变得复杂,例如参数化或初始化许多列表。 如果有构造函数,也有对应的析构函数。 对象被销毁时调用。 更多的APP可以在MQL5参考手册中阅读。

# 派生类 Derived Classes

面向对象还提供了继承这一非常有用的功能。 为了方便起见,可以使用一个类作为模板来创建另一个类。 继承类继承父类的所有方法和属性。 (当然,除了私有声明的属性和方法以外,不允许继承)。 可以在继承类中添加方法和属性。

举例说明这种继承关系和特性。

类CIMA :公共指示器

{

公共:

int init (字符串符号,枚举时间帧时间帧,整数序列时段,

int pMAShift,枚举方法,枚举应用价格;

(; CiMA类继承了CIndicator类并声明了新方法,Init ()、pMAShift )。

公共方法声明这两个方法是公开的,可以访问并且可以继承。

实施Init方法。

int CIMA :3360 init (字符串符号,枚举时间帧时间帧,整数序列周期,

int pMAShift,枚举方法,枚举应用价格)

{

handle=IMA(psymbol、pTimeframe、PMA期间、pMAShift、PMA方法、PMA价格);

返回(处理);

}Init方法的接收参数很多,请注意参数的数据类型。 方法的返回值为int类型。

# 虚拟方法 Virtual Functions

中,可能需要在继承类中修改方法,也可能需要在父类中定义方法,但可能会影响继承类的接口。 此时,需要“虚拟方法”。

以Car为例。 Class Car有一种叫ShiftGear的方法。 但是,ShiftGear的实现有手动方式和自动方式,实现方法完全不同。 在这种情况下,可以将ShiftGear ()声明为虚拟方法。 然后,在继承类内具体写入实现的详细内容。 很好地解决了这个问题。

举例说明:

类汽车

{

公共:

虚拟语言环境(int gear )返回) gear; }

(; 一定记得虚拟关键字。

以下是ShiftGear ()在继承类中的具体实现。

类手动汽车:公共汽车

{

公共:

intshiftgears(intgear );

(; 如您所见,重写ShiftGear方法变得很容易。 接收的参数和返回值必须与父类相同,并且方法名称也必须完全匹配。

如果继承类具有与父类完全相同的方法名称,则会复盖父类的方法。 这种在统一类中重写父类的方法的特性称为“多态性”!

还是以上面的CiMA类为例吧。 进行修改,将CIndicator的Init接口声明为虚拟类,并在继承类中实现。

类别指示器

{

受保护的:

智能手机;

公共:

虚拟初始化()返回)处理程序); }

(; 现在不需要修改CiMA,可以使用Init方法了。 如果类已经编写,则方法名称相同,将自动被复盖。

# 对象 Object

中,定义了移动平均值指示器CiMA。 接下来,创建类的几个实例对象。

CiMA objMa; 实例化对象时,将自动执行类的构造函数。 CiMA继承自CIndicator,而CIndicator的构造函数也继承自CiMA。 objMa是CiMA的实例,是在实例化时CiMA-CIndicator-Constrator自动执行的过程。 也就是说,情况如下。

是指示器:3360指示器(void )

{

阵列集系列(主,真);

{1}对象创建后,可以访问公共成员。 使用点(.)操作符。 首先,调用这个指示器的初始化方法。

obj ma.init (符号,0,符号,0,符号,符号价格); 观察上述代码,Init方法在CiMA内实现,调用iMA方法返回移动平均值,代入CiMA的保护变量handle。

它还声明了一个保护属性main[],用于存储指示符数据。 无法访问保护属性。 使用公共方法Main ()进行操作。

print(objma.main ) ) )如果需要,还可以在程序中创建许多对象。 实例化的时候,使用不同的名字就可以了。 这种面向对象的方法可以节省时间,避免大量重复代码,使程序看起来更简洁、更高效,在处理大量复杂的事务任务时非常有用。