OLP. Problèmes d'application

 

Le sujetde la POO s'est transformé en un échange d'opinions "bonnes ou moins bonnes". Je voudrais des réponses à des questions plus terre à terre.

La question est la suivante. Dans un manuel sur le C++, j'ai trouvé la mention qu'une instance d'une classe peut devenir le descendant de deux classes parentes différentes simultanément.

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

Ou quelque chose de similaire (je ne trouve pas la source). Quelle est la situation dans MQL5 ? Est-il possible de déclarer que la classe est un descendant de deux classes parentes différentes ? Quelle est la syntaxe ?

La phrase de l'Aide : "Pas d'héritage multiple" ne correspond-elle pas à cette situation ?

 
Yedelkin:

Le sujet del'OLP s'est transformé en un échange d'opinions "bonnes ou moins bonnes". Je voudrais des réponses à des questions plus terre à terre.

La question est la suivante. Dans un manuel sur le C++, j'ai trouvé la mention qu'une instance d'une classe peut devenir le descendant de deux classes parentes différentes simultanément.

Ou quelque chose de similaire (je ne trouve pas la source). Quelle est la situation dans MQL5 ? Est-il possible de déclarer que la classe est un descendant de deux classes parentes différentes ? Quelle est la syntaxe ?

La phrase de l'Aide : "Pas d'héritage multiple" ne correspond-elle pas à cette situation ?

Dans MQL5, l'héritage multiple n'est pas supporté, mais il existe un mécanisme intéressant pour le passage du pointeur d'objet, par lequel quelque chose comme ceci peut être implémenté.

 

Avec la POO, il est très facile de structurer le code (pardonnez la trivialité). Vous prenez et tamponnez les méthodes une par une. C'est très efficace et clair. Mais une question se pose : cette multiplicité de wrappers n'affecte-t-elle pas la vitesse de traitement du code par le processeur ? Plus précisément, y a-t-il une différence dans la vitesse d'exécution entre ces deux fragments de code ?

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

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

Ou bien, à l'étape de la compilation, le code est-il converti du langage humain au langage machine de sorte que ces deux variantes ne diffèrent pas du tout en termes de vitesse de traitement pour un ordinateur ?

 
Urain:

L'héritage multiple n'est pas supporté dans MQL5 ...

Donc "l'héritage multiple" est la pluralité des parents ?

 
Yedelkin:
Donc "l'héritage multiple" est une parentalité plurielle ?

Oui exactement, une classe peut avoir un parent, la cascade le peut, mais deux parents et mql5 ne le peuvent pas.

En principe, au lieu de l'héritage, vous pourriez appeler la classe "type as parent" dans la classe elle-même et accéder aux données du "type as parent" via son pointeur.

 
Urain:
Oui exactement, une classe peut avoir un parent, la cascade le peut, mais deux parents et mql5 ne le peuvent pas.
OK, je l'ai. Je n'ai pas pensé à chercher la signification de ce terme tout de suite.
 
Yedelkin:

Ce code n'est pratiquement pas différent de l'héritage multiple.

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;};
  };
//+------------------------------------------------------------------+
En fait, la classe C_C a accès aux données de C_A et C_B via des pointeurs appropriés.
 
Urain:

Ce code n'est pratiquement pas différent de l'héritage multiple.

En fait, la classe C_C a accès aux données de C_A et C_B par le biais de pointeurs correspondants.

Cool ! Je n'aurais pas pensé à créer une instance d'une classe externe dans le constructeur. Merci pour votre aide !

Addendum. Et dans cette ligne

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

L'opérateur new est appliqué au constructeur C_A() de la classe C_A.

Dans le livre de référence, j'ai compris que l'opérande de l'opérateur new est la classe elle-même, et non son constructeur. Quelles particularités peut-il y avoir ici ?

 
D'ailleurs, au bout d'un moment, les concepteurs auront des paramètres qui fonctionneront, ce qui facilitera grandement la vie des développeurs.
 
Renat:
D'ailleurs, au bout d'un moment, les concepteurs auront des paramètres qui fonctionneront, ce qui facilitera grandement la vie des développeurs.
Oui, je m'en souviens :)
 
Yedelkin:

Cool ! Je n'aurais pas pensé à créer une instance d'une classe externe dans le constructeur. Merci pour votre aide !

Addendum. Et dans cette ligne.

L'opérateur new est appliqué au constructeur C_A() de la classe C_A.

Dans le livre de référence, j'ai compris que l'opérande de l'opérateur new est la classe elle-même, et non son constructeur. Quelles particularités peut-il y avoir ici ?

L'opérateur new crée une instance de la classe et un constructeur est appelé en même temps. C'est écrit dans la syntaxe, vous ne pouvez donc pas l'appeler autrement.

Tout se passe automatiquement dans la déclaration statique.

Au fait, ceci fonctionnera aussi et sera automatiquement détruit.

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
Raison: