OOP, plantillas y macros en mql5, sutilezas y usos - página 8

 
Alexey Navoykov:
¿Te refieres a su biblioteca estándar? )

No, me refiero a que en MQL no se puede declarar un método virtual abstracto sin implementación. En MQL, los métodos virtuales de una clase base deben tener siempre una implementación, lo cual está plagado de los problemas que mencionas.

 
Ilya Malev:

No hay muchas interfaces básicas en C#

De hecho, hay muchos.

Ilya Malev:

En mi opinión, no todo es malo. No hay tantas interfaces principales básicas en C#, en mi opinión (no soy especialista en C#), como para no poder reducir sus métodos a una superclase básica y luego heredar lo que necesites.

P.D. Implementar algo múltiple a través de construcciones como <<<<>>>> es un poco pesado. Es mejor hacer las funciones a través de operadores, por ejemplo, a==b llama a.compareto( b ), a[comparer]==b llama a comparer.compare(a,b) etc.

En mi opinión, sería un terrible batiburrillo.

+ Llamar a métodos virtuales no es gratis.
 
Vasiliy Sokolov:

No, me refiero a que en MQL no se puede declarar un método virtual abstracto sin implementación. En MQL, los métodos virtuales de una clase base deben tener siempre una implementación, lo cual está plagado de los problemas que mencionas.

No estoy seguro de por qué no se puede declarar sin aplicación? Los métodos de las clases abstractas han sido soportados en MQL durante años.

 
Vasiliy Sokolov:

1. De hecho, hay muchos.

2. en mi opinión, sería un terrible batiburrillo.

+ La llamada a los métodos virtuales no es gratuita.

1. Lo sabré yo.

2. A ver qué pasa, si consigo hacer bien lo que estoy haciendo ahora, lo publicaré en el foro).

No gratis, sí. Cualquier solución OOP universal resulta ser cara, pero si su propósito es construir fácil y bellamente Asesores Expertos e indicadores simples (sin características especiales), entonces vale la pena, imho.

 
Alexey Navoykov:

No entiendo muy bien por qué no se puede declarar sin implementar? Los métodos de las clases abstractas han sido soportados en MQL durante años.

Porque una entrada como ésta causará un error de compilación:

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:

Porque una entrada como ésta provocará un error de compilación:

Y la persona pensó que es imposible declarar tal método en MQL en absoluto, por lo que entendí de su post.

 

Poca gente lo sabe (menos aún los que lo saben y lo usan), perolas funciones puramente virtuales pueden tener un cuerpo

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

También tienen que ser sobrecargados en la clase descendiente

 
Ilyas:

Poca gente lo sabe (menos aún lo sabe y lo utiliza), pero lasfunciones puramente virtuales pueden tener un cuerpo

También tienen que ser sobrecargados en la clase descendiente

Entonces, ¿las interfaces pueden seguir teniendo su propio código de método? ¿Se puede llamar de alguna manera? )

Me encontré con esto recientemente...

 
Hmm, interesante característica... Supongo que se trata de una implementación por defecto, que puede ser llamada en los descendientes como A::f2(). es decir:
class B : public A
{
  virtual int f2() { return A::f2(); }
};
p.d. Sin embargo, lo he probado ahora... Aunque A::f2() no tenga cuerpo, el compilador no reacciona a esa llamada. Es decir, tengo que atrapar un error después en el tiempo de ejecución. No hay manera.
 
Alexey Navoykov:
Hmm, interesante característica... Supongo que es un método por defecto, sólo para ser llamado en los descendientes de A::f2().

Lo he probado - tienes razón en general =)

Alexey Navoykov:
p.d. Aunque ahora lo he probado... Aunque A::f2() no tenga cuerpo, el compilador no reacciona nada a esa llamada.
Reaccioné con "stack overflow" )

Aparentemente es una cucaracha después de todo...

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