OLP. Problemi di applicazione

 

L'argomento"OLP" si è trasformato in uno scambio di opinioni "buono o cattivo". Vorrei risposte a domande più concrete.

La domanda è questa. In un libro di testo su C++ ho incontrato un accenno al fatto che un'istanza di una classe può essere resa discendente di due classi madri diverse simultaneamente, come

class A
{...}
class B
{...}
class C : public A : public B
{...}

O qualcosa di simile (non riesco a trovare la fonte). Qual è la situazione in MQL5? È possibile dichiarare che la classe è una discendente di due diverse classi madri? Qual è la sintassi?

La frase di Help: "Nessuna eredità multipla" non riguarda questa situazione?

 
Yedelkin:

L'argomentodell'OLP si è trasformato in uno scambio di opinioni "buono o meno buono". Vorrei risposte a domande più concrete.

La domanda è questa. In un libro di testo su C++ ho incontrato un accenno al fatto che un'istanza di una classe può essere resa discendente di due classi madri diverse simultaneamente, come

O qualcosa di simile (non riesco a trovare la fonte). Qual è la situazione in MQL5? È possibile dichiarare che la classe è una discendente di due diverse classi madri? Qual è la sintassi?

La frase di Help: "Nessuna eredità multipla" non riguarda questa situazione?

In MQL5 l'ereditarietà multipla non è supportata, ma c'è un interessante meccanismo per il passaggio del puntatore dell'oggetto, attraverso il quale qualcosa del genere può essere implementato.

 

Con OOP, è molto facile strutturare il codice (scusate la banalità). Si prendono e si timbrano i metodi uno per uno. È molto efficace e chiaro. Ma sorge una domanda: questi wrapper multipli non influenzano la velocità di elaborazione del codice del processore? In particolare, c'è qualche differenza nella velocità di esecuzione tra questi due frammenti di codice?

double ddd=0.0;                   //первый вариант кода, инициализация без применения функций/методов
 

double ddd;                       //второй вариант кода, инициализация с применением функций/методов
void function(double a) { a=0.0; }
...
function(ddd);

O nella fase di compilazione il codice viene convertito dal linguaggio umano al linguaggio macchina in modo che entrambe queste varianti non differiscano affatto nella velocità di elaborazione per un computer?

 
Urain:

L'eredità multipla non è supportata in MQL5 ...

Quindi "l'eredità multipla" è la pluralità dei genitori?

 
Yedelkin:
Quindi "l'eredità multipla" è la genitorialità plurale?

Sì, esattamente, una classe può avere un solo genitore, a cascata sì, ma due genitori e mql5 no.

In linea di principio, invece dell'ereditarietà, si potrebbe chiamare la classe "tipo come genitore" nella classe stessa e accedere ai dati del "tipo come genitore" tramite il suo puntatore.

 
Urain:
Sì, esattamente, una classe può avere un solo genitore, a cascata sì, ma due genitori e mql5 no.
Ok, ho capito. Non ho pensato di cercare subito il significato del termine.
 
Yedelkin:

Questo codice non è quasi diverso dall'ereditarietà multipla.

class C_A
  {
public:
                     C_A(void){};
                    ~C_A(void){};
   double            a;
  };
//+------------------------------------------------------------------+
class C_B
  {
public:
                     C_B(void){};
                    ~C_B(void){};
   double            b;
  };
//+------------------------------------------------------------------+
class C_C
  {
public:
   C_A              *ua;
   C_B              *ub;
                     C_C(void){ua=new C_A();ub=new C_B();};
                    ~C_C(void){delete ua;delete ub;};
  };
//+------------------------------------------------------------------+
Infatti, la classe C_C ha accesso ai dati C_A e C_B tramite puntatori appropriati.
 
Urain:

Questo codice non è quasi diverso dall'ereditarietà multipla.

Infatti, la classe C_C ha accesso ai dati di C_A e C_B attraverso puntatori corrispondenti.

Fico! Non avrei mai pensato di creare un'istanza di una classe esterna nel costruttore. Grazie per l'aiuto!

Addendum. E in questa linea

C_C(void){ua=new C_A();ub=new C_B();};

Il nuovo operatore viene applicato al costruttore C_A() della classe C_A.

Dal libro Reference, ho capito che l'operando del nuovo operatore è la classe stessa, non il suo costruttore. Quali particolarità ci possono essere qui?

 
A proposito, dopo un po', i designer avranno dei parametri funzionanti, il che renderà la vita molto più facile agli sviluppatori.
 
Renat:
A proposito, dopo un po' i designer avranno dei parametri funzionanti, il che renderà la vita molto più facile agli sviluppatori.
Sì, me lo ricordo :)
 
Yedelkin:

Fico! Non avrei mai pensato di creare un'istanza di una classe esterna nel costruttore. Grazie per l'aiuto!

Addendum. E in questa linea.

Il nuovo operatore viene applicato al costruttore C_A() della classe C_A.

Dal libro Reference, ho capito che l'operando del nuovo operatore è la classe stessa, non il suo costruttore. Quali particolarità ci possono essere qui?

L'operatore new crea un'istanza della classe e insieme ad essa viene chiamato un costruttore. È scritto nella sintassi, quindi non si può chiamare altrimenti.

Tutto avviene automaticamente nella dichiarazione statica.

A proposito, questo funzionerà anche e sarà automaticamente distrutto

class C_C
  {
public:
   C_A               ua;
   C_B               ub;
                     C_C(void){};
                    ~C_C(void){};
  };
//+------------------------------------------------------------------+
Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
  • www.mql5.com
Основы языка / Операторы / Оператор создания объекта new - Документация по MQL5