PLO. Fragen zur Anwendung

 

Das Thema"PLO" hat sich zu einem Meinungsaustausch über "gut oder schlecht" entwickelt. Ich hätte gerne Antworten auf eher bodenständige Fragen.

Die Frage ist folgende. In einem Lehrbuch über C++ wurde erwähnt, dass eine Instanz einer Klasse gleichzeitig zum Nachkommen von zwei verschiedenen Elternklassen gemacht werden kann, z. B.

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

Oder etwas Ähnliches (ich kann die Quelle nicht finden). Wie ist die Situation in MQL5? Ist es möglich, zu erklären, dass die Klasse ein Nachkomme von zwei verschiedenen Elternklassen ist? Wie lautet die Syntax?

Gilt für diese Situation nicht der Satz aus Help: "Keine Mehrfachvererbung"?

 
Yedelkin:

Das Thema"PLO" hat sich zu einem Meinungsaustausch über "gut oder schlecht" entwickelt. Ich hätte gerne Antworten auf eher bodenständige Fragen.

Die Frage ist folgende. In einem Lehrbuch über C++ wurde erwähnt, dass eine Instanz einer Klasse gleichzeitig zum Nachkommen von zwei verschiedenen Elternklassen gemacht werden kann, z. B.

Oder etwas Ähnliches (ich kann die Quelle nicht finden). Wie ist die Situation in MQL5? Ist es möglich, zu erklären, dass die Klasse ein Nachkomme von zwei verschiedenen Elternklassen ist? Wie lautet die Syntax?

Gilt für diese Situation nicht der Satz aus Help: "Keine Mehrfachvererbung"?

In MQL5 wird Mehrfachvererbung nicht unterstützt, aber es gibt einen interessanten Mechanismus für die Übergabe des Objektzeigers, mit dem so etwas implementiert werden kann.

 

Mit OOP ist es sehr einfach, den Code zu strukturieren (entschuldigen Sie die Trivialität). Sie nehmen und stempeln eine Methode nach der anderen. Es ist sehr effektiv und klar. Es stellt sich jedoch eine Frage: Beeinträchtigt diese Vielzahl von Wrappern nicht die Geschwindigkeit der Codeverarbeitung durch den Prozessor? Gibt es einen Unterschied in der Ausführungsgeschwindigkeit zwischen diesen beiden Codefragmenten?

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

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

Oder wird der Code in der Kompilierungsphase von der menschlichen Sprache in die Maschinensprache umgewandelt, so dass sich diese beiden Varianten in der Verarbeitungsgeschwindigkeit für einen Computer überhaupt nicht unterscheiden?

 
Urain:

Mehrfachvererbung wird in MQL5 nicht unterstützt ...

Mehrfache Vererbung" bedeutet also, dass es mehrere Eltern gibt?

 
Yedelkin:
Mehrfaches Erbe" ist also Plural-Elternschaft?

Ja, genau eine Klasse kann einen Elternteil haben, Kaskadierung kann, aber zwei Elternteile und mql5 nicht.

Im Prinzip könnte man anstelle der Vererbung die Klasse "type as parent" in der Klasse selbst aufrufen und über ihren Zeiger auf die Daten des "type as parent" zugreifen.

 
Urain:
Ja, genau, eine Klasse kann einen Elternteil haben, Kaskadierung kann, aber zwei Elternteile und mql5 nicht.
OK, ich hab's. Ich habe nicht sofort daran gedacht, die Bedeutung des Begriffs nachzuschlagen.
 
Yedelkin:

Dieser Code unterscheidet sich fast nicht von der Mehrfachvererbung.

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;};
  };
//+------------------------------------------------------------------+
In der Tat hat die Klasse C_C über entsprechende Zeiger Zugriff auf die Daten von C_A und C_B.
 
Urain:

Dieser Code unterscheidet sich fast nicht von der Mehrfachvererbung.

In der Tat hat die Klasse C_C über entsprechende Zeiger Zugriff auf die Daten von C_A und C_B.

Super! Ich hätte nicht daran gedacht, im Konstruktor eine Instanz einer externen Klasse zu erzeugen. Vielen Dank für die Hilfe!

Nachtrag. Und in dieser Zeile

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

Der new-Operator wird auf den C_A()-Konstruktor der Klasse C_A angewendet.

Aus dem Referenzbuch habe ich entnommen, dass der Operand des new-Operators die Klasse selbst ist, nicht ihr Konstruktor. Welche Besonderheiten kann es hier geben?

 
Übrigens werden die Designer nach einer gewissen Zeit über funktionierende Parameter verfügen, was den Entwicklern das Leben sehr erleichtern wird.
 
Renat:
Übrigens werden die Designer nach einiger Zeit über funktionierende Parameter verfügen, was den Entwicklern das Leben sehr erleichtern wird.
Ja, ich erinnere mich daran :)
 
Yedelkin:

Super! Ich hätte nicht daran gedacht, im Konstruktor eine Instanz einer externen Klasse zu erzeugen. Vielen Dank für die Hilfe!

Nachtrag. Und in dieser Zeile.

Der new-Operator wird auf den C_A()-Konstruktor der Klasse C_A angewendet.

Aus dem Referenzbuch habe ich entnommen, dass der Operand des new-Operators die Klasse selbst ist, nicht ihr Konstruktor. Welche Besonderheiten kann es hier geben?

Der new-Operator erzeugt eine Instanz der Klasse, und ein Konstruktor wird mit ihr aufgerufen. Sie ist in der Syntax festgeschrieben, so dass Sie sie nicht anders aufrufen können.

Bei der statischen Deklaration geschieht alles automatisch.

Das funktioniert übrigens auch und wird automatisch zerstört

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
Grund der Beschwerde: