Просьба к разработчикам: в документации помечать виртуальные методы словом 'virtual'

 

Когда читаешь документацию, не совсем понятно, какие методы реализованы натурально, а какие методы определены декларатоивно, на уровне интерфейса. Т.е. разработчики определяют виртуальную функцию и ее параметры (интерфейс), а пользователи уже сами должны наполнять ее содержимым. 

Вот читаешь допустим доку по классу CList:

Метод Save - Сохраняет данные списка в файл. Однако нигде почему-то не написано, что это только декларативный метод и сам по себе он ничего сохранять не будет. Что бы он что то сохранял необходимо его наполнить конкретным содержимым. Указание что это виртуальный метод, быстро сможет сориентировать пользователей. Особенно это касается базовых классов. Таких методов там очень много.

Документация по MQL5: Основы языка / Объектно-ориентированное программирование / Виртуальные функции
Документация по MQL5: Основы языка / Объектно-ориентированное программирование / Виртуальные функции
  • www.mql5.com
Основы языка / Объектно-ориентированное программирование / Виртуальные функции - Документация по MQL5
 

Вообще-то, полная реализация виртуальных методов Save и Load присутствует:

//+------------------------------------------------------------------+
//| Writing list to file.                                            |
//| INPUT:  file_handle -handle previously opened for writing file.  |
//| OUTPUT: true if OK, else false.                                  |
//| REMARK: m_curr_node unchanged.                                   |
//+------------------------------------------------------------------+
bool CList::Save(int file_handle)
  {
   CObject *node;
   bool     result=true;
//--- checking
   if(!CheckPointer(m_curr_node) || file_handle<0) return(false);
//--- writing
//--- writing begin marker - 0xFFFFFFFFFFFFFFFF
   if(FileWriteLong(file_handle,-1)!=sizeof(long)) return(false);
//--- writing type
   if(FileWriteInteger(file_handle,Type(),INT_VALUE)!=INT_VALUE) return(false);
//--- writing list size
   if(FileWriteInteger(file_handle,m_data_total,INT_VALUE)!=INT_VALUE) return(false);
//--- sequential scan elements of the list, with a method call Save()
   node=m_first_node;
   while(node!=NULL)
     {
      result&=node.Save(file_handle);
      node=node.Next();
     }
//---
   return(result);
  }
//+------------------------------------------------------------------+
//| Reading list from file.                                          |
//| INPUT:  file_handle -handle previously opened for reading file.  |
//| OUTPUT: true if OK, else false.                                  |
//| REMARK: m_curr_node unchanged.                                   |
//+------------------------------------------------------------------+
bool CList::Load(int file_handle)
  {
   uint     i,num;
   CObject *node;
   bool     result=true;
//--- checking
   if(file_handle<0) return(false);
//--- reading
//--- reading and checking begin marker - 0xFFFFFFFFFFFFFFFF
   if(FileReadLong(file_handle)!=-1) return(false);
//--- reading and checking type
   if(FileReadInteger(file_handle,INT_VALUE)!=Type()) return(false);
//--- reading list size
   num=FileReadInteger(file_handle,INT_VALUE);
//--- progressive establishment of list items, with the method call Load()
   Clear();
   for(i=0;i<num;i++)
     {
      node=CreateElement();
      if(node==NULL) return(false);
      Add(node);
      result&=node.Load(file_handle);
     }
//---
   return(result);
  }

Конечно их можно переопределить, но в 99% случаев этот способ сериализации списков отлично подходит.


Но упоминание виртуальности конечно надо добавить в документацию. Спасибо!