OOP, Vorlagen und Makros in mql5, Feinheiten und Anwendungen - Seite 8

 
Alexey Navoykov:
Beziehen Sie sich auf deren Standardbibliothek? )

Nein, ich meine, dass man in MQL eine abstrakte virtuelle Methode nicht ohne Implementierung deklarieren kann. In MQL müssen virtuelle Methoden einer Basisklasse immer eine Implementierung haben, was mit den von Ihnen erwähnten Problemen behaftet ist.

 
Ilya Malev:

Es gibt nicht viele grundlegende Schnittstellen in C#

Tatsächlich gibt es eine Menge davon.

Ilya Malev:

Meiner Meinung nach ist nicht alles schlecht. Meiner Meinung nach gibt es in C# nicht so viele grundlegende Schnittstellen (ich bin kein C#-Spezialist), dass man ihre Methoden nicht auf eine grundlegende Oberklasse reduzieren und dann erben kann, was man braucht.

P.S. Etwas mehrfaches durch Konstruktionen wie <<<<>>>> zu implementieren ist ein bisschen mühsam. Besser ist es, Funktionen durch Operatoren auszuführen, z. B. a==b ruft a.compareto( b ) auf, a[comparer]==b ruft comparer.compare(a,b) auf usw.

Imho wäre das ein schrecklicher Mischmasch.

+ Der Aufruf von virtuellen Methoden ist nicht kostenlos.
 
Vasiliy Sokolov:

Nein, ich meine, dass man in MQL eine abstrakte virtuelle Methode nicht ohne Implementierung deklarieren kann. In MQL müssen virtuelle Methoden einer Basisklasse immer eine Implementierung haben, was mit den von Ihnen erwähnten Problemen behaftet ist.

Ich bin mir nicht sicher, warum man es nicht ohne Implementierung deklarieren kann? Abstrakte Klassenmethoden werden in MQL schon seit Jahren unterstützt.

 
Vasiliy Sokolov:

1. Es gibt sogar eine ganze Reihe von ihnen.

2. Imho wäre es ein schrecklicher Mischmasch.

+ Der Aufruf von virtuellen Methoden ist nicht kostenlos.

1. ich werde es wissen.

2. Mal sehen, was passiert, wenn ich das, was ich jetzt mache, richtig hinbekomme, werde ich es im Forum posten).

Nicht umsonst, ja. Jede universelle OOP-Lösung ist teuer, aber wenn Ihr Ziel darin besteht, einfache Expert Advisors und Indikatoren (ohne besondere Funktionen) einfach und schön zu erstellen, dann ist es das wert, imho.

 
Alexey Navoykov:

Ich verstehe nicht wirklich, warum man nicht ohne Implementierung deklarieren kann? Abstrakte Klassenmethoden werden in MQL schon seit Jahren unterstützt.

Denn ein Eintrag wie dieser führt zu einem Kompilierungsfehler:

class A
 {
public:
  virtual int f1() = 0;
  virtual int f2() = 0;
 };
 
class B: public A
 {
public:
  virtual int f1(){ return 1; } 
 };
 
void OnStart()
 {
   B b;
 }


 
Ilya Malev:

Denn ein Eintrag wie dieser führt zu einem Kompilierfehler:

Und die Person dachte, dass es unmöglich ist, eine solche Methode in MQL überhaupt zu deklarieren, so weit ich das aus seinem Beitrag verstanden habe.

 

Nur wenige Menschen wissen es (und noch weniger, die es wissen und benutzen), aber rein virtuelleFunktionen können einen Körper haben

class A
 {
public:
  virtual int f1() = 0;
  virtual int f2() = 0 { return(0); }
 };

Sie müssen auch in der Nachfolgeklasse überladen werden

 
Ilyas:

Nur wenige Menschen wissen (und noch weniger wissen und verwenden), dass rein virtuelleFunktionen einen Körper haben können

Sie müssen auch in der Nachfolgeklasse überladen werden

Schnittstellen können also weiterhin ihren eigenen Methodencode haben? Kann man es irgendwie nennen? )

Ich bin erst kürzlich darauf gestoßen...

 
Hmm, interessantes Feature... Ich nehme an, dies ist eine Standardimplementierung, die in Nachkommen als A::f2() aufgerufen werden kann. d.h.:
class B : public A
{
  virtual int f2() { return A::f2(); }
};
p.s. Ich habe es jetzt ausprobiert... Selbst wenn A::f2() keinen Körper hat, reagiert der Compiler nicht auf einen solchen Aufruf. D.h. ich muss später in der Laufzeit einen Fehler abfangen. Keine Chance.
 
Alexey Navoykov:
Hmm, interessantes Feature... Ich vermute, es ist eine Standardmethode, die nur in Nachfahren von A::f2() aufgerufen wird.

Getestet - Sie haben im Allgemeinen Recht =)

Alexey Navoykov:
p.s. Obwohl ich es jetzt ausprobiert habe... Selbst wenn A::f2() keinen Körper hat, reagiert der Compiler nicht auf einen solchen Aufruf.
Ich reagierte mit "Stack Overflow" )

Offenbar ist es doch eine Kakerlake...

class A
 {
public:
  virtual int f1() = 0 { return 1; }
  virtual int f2() = 0;
 };
 
class B: public A
 {
public:
  virtual int f1(){ return A::f1(); } 
  virtual int f2(){ return A::f2(); } 
 };
 
void OnStart()
 {
   A*a=new B;
   Print(a.f1());
   Print(a.f2());
 }