类型的密封和扩展

OOP是编写软件的均衡办法。数据和行为放在一起。密封创建了定义用户的数据类型,扩展语言数据类型并相互作用。类型扩展是一个向语言添加用户定义数据类型的机会,该类型像基本类型一样,很容易使用。

抽象数据类型,例如,字符串,是著名行为类型理想的描述。

字符串用户知道字符串操作,例如连结或者打印,都有一定的行文。连结和打印操作称为类函数。

某种ADT执行有一定的限制,例如,字符串长度有限制。这些限制影响了行为全部开放。同时,内部或者私人执行细节不直接影响用户看对象的方法。例如,字符串尝以数组来执行,而这个数组的内部基本地址及其名称对于用户则不是必须的。

密封就是当向用户定义类型提供端口时,隐藏执行细节的能力。在MQL5中,及在C++中,类和结构定义(结构 )用于接入关键字 privateprotectedpublic连结的封存规定中。

关键字public 接入其后面的成员,无任何限制就可以打开。无关键字,类成员默认封锁。个人成员仅可以接入这个类里成员函数。

Protected类函数不仅可以在其类中得到,也可以在其继承类中得到。Public类函数可以在类声明范围任一函数中得到。保护可以隐藏类的部分执行,因此阻止了数据结构中意外改变。接入限制和数据隐藏都是面向对象程序设计的一个特点。

通常情况下,类函数由protected修饰符保护和声明,读取和编写值通过使用publics接入修饰符定义的所谓的特别的set-and get-类函数来执行。

示例:

class CPerson
  {
protected:
   string            m_name;                     // 名称
public:
   void              SetName(string n){m_name=n;}// 设置 名称
   string            GetName(){return (m_name);} // 返回 名称
  };

 

这个办法提供了几种优势。首先,通过函数名我们知道它是做什么的-设置或者获得类成员值。其次,也许在将来我们将需要改变CPerson类中或者任一衍生类中的m_name CPerson变量类型。

在这种情况下,我们只需要改变执行函数SetName()和GetName(),而CPerson类的对象可用于使用无代码改变的程序因为用户甚至不知道m_name数据类型已经改变。

示例:

struct Name
  {
   string            first_name;                 // 名称
   string            last_name;                  // 上一个 名称
  };
 
class CPerson
  {
protected:
   Name              m_name;                     // 名称
public:
   void              SetName(string n);
   string            GetName(){return(m_name.first_name+" "+m_name.last_name);}
private:
   string            GetFirstName(string full_name);
   string            GetLastName(string full_name);
  };
 
void CPerson::SetName(string n)
  {
   m_name.first_name=GetFirstName(n);
   m_name.last_name=GetLastName(n);
  }
 
string CPerson::GetFirstName(string full_name)
  {
   int pos=StringFind(full_name," ");
   if(pos>0) StringSetCharacter(full_name,pos,0);
   return(full_name);
  }
 
string CPerson::GetLastName(string full_name)
  {
   string ret_string;
   int pos=StringFind(full_name," ");
   if(pos>0) ret_string=StringSubstr(full_name,pos+1);
   else      ret_string=full_name;
   return(ret_string);
  }

另见

数据类型