MQL5中增加的一个重要特性就是面向对象。面向对象编程提倡代码的重用,对用户隐藏无意义的接口细节。这位灵活创建大型的应用奠定了基础。
面向对象编程的信条,是属性的抽象化。对于新手而言,会有或多或少的疑惑。不过随着程序的深入,相信你会逐步掌握其中的诀窍。
两个部件,一是对象,一是类。类是属性和方法的集合。对象是实例化的类。
这么说吧,类呢,像是一个模具,对象就是一个一个的模型。我们把属性和方法,抽象为类。那么在使用的时候,对其进行实例化,这个对象就拥有了类所有的特性。
类声明为全局作用域,就想函数。类可以放置在程序内部,或include文件内部。使用class关键词声明,且需要类名唯一。下面是一个类的例子:
class CIndicator
{
protected:
int handle;
double main[];
public:
double Main(int pShift=0);
void Release();
CIndicator();
};
类名叫Cindicator。包含两个保护属性。共有方法中,声明了两个方法main, Release。还要一个默认的构造器constructor CIndicator()。为什么这么写,我们后面会专门讲解,无需担心。
public,private,protected是访问修饰符,用于控制变量的使用范围。
面向对象的信条,是对外隐藏类成员,我们称之为“封装”。
上面的例子内我们声明在类CIndicator内定义了一个公有方法Main()。我们在下面创建这个函数:
double CIndicator::Main(int pShift=0)
{
CopyBuffer(handle,0,0,MAX_COUNT,main);
double value = NormalizeDouble(main[pShift],_Digits);
return(value);
}
该方法接收一个形参pShift。在函数体内容部,使用CopyBuffer赋值指标值并赋值给main[]数组。注意,这个main[]就是protected内声明的数组。接着对数组的值main[pShift]格式化并返回。
这个简单的方法,实现了对保护变量main的操作。
上面说的是常用的一种方法的声明和创建。还有一种懒惰的写法,行内直接定义和创建,想下面这样写:
public:
void Release(){ IndicatorRelese(handle); }
这就可以了,少了一堆符号。好处不言而喻,坏处呢,就是不易扩展维护。每天都要变更需求,改来改去,推荐还是另一起一行,单独声明的好。