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

 

Вопрос в следующем: можно ли в классе 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));
  }

 
Все верно, так и делается: свойства приватные, доступ к ним через методы типа Get и Set.
 
Единственное, это лишний огород. Достаточно
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;
}

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

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

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

 
peterlogin:

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

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

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

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

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

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

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

 
Спасибо за ответы