Как объявить свойство класса в MQL4

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Peter Vorobyev
406
Peter Vorobyev  

Вопрос в следующем: можно ли в классе MQL4 объявить свойство не в виде метода, а именно в виде свойства, которое бы ссылалось на защищенное свойство этого класса. Как например в Delphi

  TTestA = class(TTest)
  private
    FTestProperty: string;
  public
    property TestProperty: string read FTestProperty write FTestProperty;

Для примера создал два описания класса в MQL4. Второй вариант задает свойства, но без защищенных свойств. Насколько правильно такое применение. И можно ли его описать правильно с точки зрения ООП

// 1) Классический вариант свойства (ID, fName, fValue1, fValue2) описаны в виде методов, но это излишне
class TTestClass1
{  
protected:
   int            fID;
   string         fName;
   double         fValue1;
   double         fValue2;

public:
   TTestClass1(void);
   ~TTestClass1(void);
   void TTestClass1::SetValume(int aID, string aTime, double aValue1, double aValue2);

   int            ID(void) const { return(fID); };
   string         Name(void) const { return(fName); };
   double         Value1(void) const { return(fValue1); };
   double         Value2(void) const { return(fValue2); };
   double         SumValue();
};
   
   TTestClass1::TTestClass1(void){}
   TTestClass1::~TTestClass1(void){}

void TTestClass1::SetValume(int aID, string aName, double aValue1, double aValue2)
{
   fID = aID;
   fName = aName;
   fValue1 = aValue1;
   fValue2 = aValue2;
}

double TTestClass1::SumValue()
{
   return(fValue1 + fValue2);
}

// 2) Вариант свойств в виде бубличных свойств. Но без защищенных свойств, что не правильно с точки зрения ООП
class TTestClass2
{  
public:
   TTestClass2(void);
   ~TTestClass2(void);
   int            ID;
   string         Name;
   double         Value1;
   double         Value2;
   double         SumValue();
};
   
   TTestClass2::TTestClass2(void){}
   TTestClass2::~TTestClass2(void){}

double TTestClass2::SumValue()
{
   return(Value1 + Value2);
}


void OnStart()
  {
   TTestClass1 t1;
   t1.SetValume(1, "test1", 1, 2);
   double t1sum = t1.SumValue();
   Print("t1sum = ", string(t1sum));
   
   TTestClass2 t2;
   t2.ID = 2;
   t2.Name = "test2";
   t2.Value1 = 1;
   t2.Value2 = 2;
   double t2sum = t2.SumValue();
   Print("t2sum =", string(t2sum));
  }

Ihor Herasko
21904
Ihor Herasko  
Все верно, так и делается: свойства приватные, доступ к ним через методы типа Get и Set.
Konstantin Nikitin
9315
Konstantin Nikitin  
Единственное, это лишний огород. Достаточно
public:
   TTestClass1(void);
   ~TTestClass1(void);
   void TTestClass1::SetValume(int aID, string aTime, double aValue1, double aValue2);
И далее.
void TTestClass1::SetValume(int aID, string aName, double aValue1, double aValue2)
{
   fID = aID;
   fName = aName;
   fValue1 = aValue1;
   fValue2 = aValue2;
}

Смотрим Структуры и, классы и интерфейсы

Peter Vorobyev
406
Peter Vorobyev  
Ihor Herasko:
Все верно, так и делается: свойства приватные, доступ к ним через методы типа Get и Set.

а насколько корректно объявление свойств класса во втором примере? 

Ihor Herasko
21904
Ihor Herasko  
peterlogin:

а насколько корректно объявление свойств класса во втором примере? 

Не вижу никакого криминала. На мой вкус не хватает только указания того, что это члены класса. То есть для себя бы сделал вот так:

int            m_nID;
string         m_sName;
double         m_fValue1;
double         m_fValue2;

"m_" - префикс (member), который помогает потом в коде определить, что имеем дело с членом класса.

"n" - указание на целочисленный тип переменной (numeric)

"s" - указание на строковый тип переменной (string)

"f" - указание на вещественный тип переменной (float)

Peter Vorobyev
406
Peter Vorobyev  
Спасибо за ответы
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий