OOP, templates et macros dans mql5, subtilités et utilisations - page 8

 
Alexey Navoykov:
Faites-vous référence à leur bibliothèque standard? )

Non, je veux dire qu'en MQL vous ne pouvez pas déclarer une méthode virtuelle abstraite sans implémentation. Dans MQL, les méthodes virtuelles d'une classe de base doivent toujours avoir une implémentation, ce qui pose les problèmes que vous avez mentionnés.

 
Ilya Malev:

Il n'y a pas beaucoup d'interfaces de base en C#

En fait, il y en a beaucoup.

Ilya Malev:

Ce n'est pas tout à fait mauvais, à mon avis. Il n'y a pas tant d'interfaces principales de base en C#, à mon avis (je ne suis pas un spécialiste du C#), que l'on ne puisse pas réduire leurs méthodes à une superclasse de base, puis hériter de ce dont on a besoin.

P.S. Mettre en œuvre quelque chose de multiple à travers des constructions comme <<<<>>>> est un peu casse-gueule. Il est préférable d'utiliser les opérateurs pour les fonctions, par exemple, a==b appelle a.compareto( b ), a[comparer]==b appelle comparer.compare(a,b), etc.

A mon avis, ce serait un terrible méli-mélo.

+ L'appel de méthodes virtuelles n'est pas gratuit.
 
Vasiliy Sokolov:

Non, je veux dire qu'en MQL vous ne pouvez pas déclarer une méthode virtuelle abstraite sans implémentation. Dans MQL, les méthodes virtuelles d'une classe de base doivent toujours avoir une implémentation, ce qui pose les problèmes que vous avez mentionnés.

Je ne vois pas pourquoi vous ne pouvez pas le déclarer sans l'implémenter ? Les méthodes des classes abstraites sont supportées dans MQL depuis des années.

 
Vasiliy Sokolov:

1. En fait, il y en a beaucoup.

2. à mon avis, ce serait un terrible méli-mélo.

+ L'appel des méthodes virtuelles n'est pas gratuit.

1. Je le saurai.

2. Voyons ce qui se passe, si je réussis à faire ce que je fais maintenant, je le posterai sur le forum).

Pas gratuitement, oui. Toute solution OOP universelle s'avère coûteuse, mais si votre objectif est de construire facilement et joliment des conseillers experts et des indicateurs simples (sans fonctionnalités spéciales), alors cela en vaut la peine, à mon avis.

 
Alexey Navoykov:

Je ne comprends pas vraiment pourquoi on ne peut pas déclarer sans implémenter ? Les méthodes des classes abstraites sont supportées dans MQL depuis des années.

Parce qu'une entrée comme celle-ci provoquera une erreur de compilation :

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:

Parce qu'une entrée comme celle-ci provoquera une erreur de compilation :

Et la personne pensait qu'il est impossible de déclarer une telle méthode dans MQL, d'après ce que j'ai compris de son message.

 

Peu de gens le savent (encore moins le savent et l'utilisent), mais lesfonctions purement virtuelles peuvent avoir un corps

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

Ils doivent également être surchargés dans la classe descendante.

 
Ilyas:

Peu de gens le savent (encore moins le savent et l'utilisent), mais lesfonctions purement virtuelles peuvent avoir un corps

Ils doivent également être surchargés dans la classe descendante.

Les interfaces peuvent donc toujours avoir leur propre code de méthode ? Peut-on l'appeler d'une manière ou d'une autre ? )

Je suis tombé sur ça récemment...

 
Hmm, caractéristique intéressante... Je suppose qu'il s'agit d'une implémentation par défaut, qui peut être appelée dans les descendants comme A::f2(). c'est-à-dire :
class B : public A
{
  virtual int f2() { return A::f2(); }
};
p.s. J'ai essayé maintenant mais... Même si A::f2() n'a pas de corps, le compilateur ne réagit pas à un tel appel. Je dois donc attraper une erreur plus tard dans le runtime. Pas moyen.
 
Alexey Navoykov:
Hmm, caractéristique intéressante... Je suppose que c'est une méthode par défaut, juste pour être appelée dans les descendants de A::f2().

Je l'ai testé - vous avez raison en général =)

Alexey Navoykov:
p.s. Bien que, j'ai essayé maintenant... Même si A::f2() n'a pas de corps, le compilateur ne réagit pas à un tel appel.
J'ai réagi avec "stack overflow" )

Apparemment, c'est un cafard après tout...

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());
 }


Raison: