Fehler, Irrtümer, Fragen - Seite 1696

 
Stanislav Korotky:

Erstens ist nicht klar, ob versucht wurde, die Methode als virtuell zu deklarieren oder nicht. Wenn es virtuell sein muss, dann schreiben Sie virtuell in der Basisklasse, nicht in der abgeleiteten Klasse (weil sonst Basiszeiger auf Basismethode gerissen werden, auch wenn Sie abgeleitete Klasse Instanz in sie setzen).

Wenn Sie eine Methode in einer abgeleiteten Klasse nicht überschreiben wollen, erwähnen Sie sie überhaupt nicht, und wenn doch, sollte sie mit einem Körper überschrieben werden.

Um schließlich die Methode vor der abgeleiteten Klasse zu verbergen, müssen Sie eine Zwischenklasse einführen, in der Sie die Methode in den privaten Bereich verschieben oder sie in der Basisklasse privat machen (aber warum ist sie dann virtuell?).

Hier ein Beispiel

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class roditel
  {
public:

   virtual int one(void)
     {
      return 1;
     }
   virtual int two(void)
     {
      return 2;
     }
   virtual int three(void)
     {
      return 3;
     }
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class naslednic_1 : public roditel
  {
public:
   virtual int       two(void);
   virtual int       three(void);
  };

naslednic_1 go;
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   go.two();
// 'two' - function must have a body    TEst.mq4        42      7
  }
//+------------------------------------------------------------------+
 
Vladimir Pastushak:

Hier ein Beispiel

Dieses Beispiel ist ungefähr dasselbe wie das erste ;-). Sie haben meinen Brief geöffnet, aber nicht gelesen? Was wollen Sie erreichen, wenn Sie die Methoden im Nachfahren neu deklarieren, aber nicht definieren? Um die Basisimplementierung aufzurufen, ohne eine neue zu haben, brauchen Sie sie nicht in der Nachkommenschaft zu erwähnen.
 
Stanislav Korotky:
Dieses Beispiel ist ungefähr dasselbe wie das erste ;-). Mein Brief wurde geöffnet, aber Sie haben ihn nicht gelesen? Was wollen Sie erreichen, indem Sie die Methoden im Nachfahren neu deklarieren, aber nicht definieren? Um eine Basisimplementierung aufzurufen, ohne eine neue zu haben, müssen Sie sie nicht in der Nachkommenschaft deklarieren.

Ich möchte nur 10 geerbte Methoden plus Methoden, die in der Nachfolgeklasse erstellt wurden, sehen. 190 Methoden, die in keiner Weise mit der aktuellen Klasse in Verbindung stehen, brauche ich nicht.

Ich habe zum Beispiel eine Basisklasse, in der alle maximalen Eigenschaften von Formen, Breite, Höhe, Ecken, Radien, Farben und Flächen beschrieben sind.

Auf der Grundlage dieser Eigenschaftsmethoden erstelle ich eine abgeleitete Kreisklasse, die Methoden der übergeordneten Klasse, Radius, Farbe, Fläche usw. verwendet. Aber ich brauche hier keine Ecken und Breiten ...

Auf der Grundlage dieser Methoden erstelle ich eine abhängige Dreiecksklasse, die die Methoden der übergeordneten Klasse, Farbe, Fläche, Ecken usw., verwendet. Aber ich brauche hier keinen Radius ...

Wenn ich frage, warum, hat die übergeordnete Klasse eine Gruppe von Methoden, die für alle oder für eine Gruppe von Formen gemeinsam sind, wie z. B. Farbe, Stil Methode.

 
Vladimir Pastushak:

Ich möchte nur 10 geerbte Methoden plus Methoden, die in der Nachfolgeklasse erstellt wurden, sehen. 190 Methoden, die in keiner Weise mit der aktuellen Klasse in Verbindung stehen, brauche ich nicht.

Ich habe zum Beispiel eine Basisklasse, in der alle maximalen Eigenschaften von Formen, Breite, Höhe, Ecken, Radien, Farben und Flächen beschrieben sind.

Auf der Grundlage dieser Eigenschaftsmethoden erstelle ich eine abgeleitete Kreisklasse, die Methoden der übergeordneten Klasse, Radius, Farbe, Fläche usw. verwendet. Aber ich brauche hier keine Ecken und Breiten ...

Auf der Grundlage dieser Methoden erstelle ich eine abhängige Dreiecksklasse, die die Methoden der übergeordneten Klasse, Farbe, Fläche, Ecken usw., verwendet. Aber ich brauche hier keinen Radius ...

Als ich fragte, warum, hat die übergeordnete Klasse eine Gruppe von Methoden, die allen oder einer Gruppe von Formen gemeinsam ist, z. B. die Methode Farbe, Stil.

Ich verstehe nicht: Diese Frage - eine Frage oder eine Antwort? Normalerweise tun sie das - in der Basisklasse ist es üblich, und in den Nachkommen werden dann Besonderheiten hinzugefügt. Warum sollte es umgekehrt sein? Was ist der Zweck?

Aber selbst wenn Sie nicht tiefer gehen, habe ich bereits eine Option vorgeschlagen - einen Zwischenabkömmling einzufügen, in dem alle unnötigen Eigenschaften und Methoden in den privaten Teil verschoben werden.

 
Frage an die Verwaltung: Wann wird es möglich sein, die neuen aktuellen Statistiken für die Dienste einzusehen?
 
Vladimir Pastushak:

Es gibt 200 Methoden in der Elternklasse, ich möchte nur 10 geerbte Methoden plus die in der Kindklasse erstellten sehen, ich brauche keine 190 weiteren Methoden, die nicht mit der aktuellen Klasse zusammenhängen.

Dazu müssen Sie die Vererbung als geschützt oder privat deklarieren und dann die benötigten Methoden außer Kraft setzen.

class naslednic_1 : protected roditel
  {
public:
   virtual int       two(void)   { return roditel::two(); }
   virtual int       three(void) { return roditel::three(); }
  };
 
Alexey Navoykov:

Dazu müssen Sie die Vererbung als geschützt oder privat deklarieren und dann die gewünschten Methoden außer Kraft setzen.

Stanislav Korotky:

Ich verstehe nicht: Ist diese Frage eine Frage oder eine unvollständige Antwort? Normalerweise machen sie es so - in einer Basisklasse das Allgemeine, und dann in Nachkommen fügen sie Einzelheiten hinzu. Warum das Gegenteil tun? Was ist der Zweck?

Aber selbst wenn Sie nicht zu tief gehen, habe ich bereits eine Option vorgeschlagen - einen Zwischenabkömmling einzufügen, in dem alle unnötigen Eigenschaften und Methoden in den privaten Teil verschoben werden.

Ich danke Ihnen.

Alexey, Ihr Beispiel funktioniert nicht, in jedem Fall bekommt das Kind Elternmethoden, die nicht weggeworfen werden sollten.


 
Woher kenne ich meinenINDICATOR_SHORTNAME? Es fehlen IndicatorGet*-Funktionen!
 
Alexey Kozitsyn:
Was passiert, wenn Sie den Kurznamen bei der Erstellung ändern?

Und jedes Mal wechseln?

Wenn der Indikator Indikatorpuffer enthält, ist die Selbstidentifizierung einfach, aber ohne Puffer sehe ich noch keine Lösung.

 
fxsaber:
Woher kenne ich meinenINDICATOR_SHORTNAME? IndicatorGet*-Funktionen gibt es nicht!
Print(MQLInfoString(MQL_PROGRAM_NAME)); gibt den Kurznamen des Indikators zurück. Wenn kein Kurzname angegeben ist, wird der vollständige Name zurückgegeben.