OOP, modelos e macros em mql5, sutilezas e usos - página 8

 
Alexey Navoykov:
Você está se referindo à biblioteca padrão deles? )

Não, quero dizer que na MQL não se pode declarar um método virtual abstrato sem implementação. Na MQL, os métodos virtuais de uma classe base devem ter sempre uma implementação, que está repleta dos problemas que você mencionou.

 
Ilya Malev:

Não há muitas interfaces básicas básicas em C#

Na verdade, há muita coisa.

Ilya Malev:

Nem tudo é ruim, na minha opinião. Não há tantas interfaces principais básicas em C#, na minha opinião (não sou especialista em C#), que você não possa reduzir seus métodos a uma superclasse básica e depois herdar o que você precisa.

P.S. Implementar algo múltiplo através de construções como <<<<>>>> é um pouco chato. Melhor fazer funções através de operadores, por exemplo, a==b chamadas a.compareto( b ), a[comparador]==b comparador de chamadas.compare(a,b) etc.

Imho, seria uma terrível amálgama.

+ Chamar métodos virtuais não é grátis.
 
Vasiliy Sokolov:

Não, quero dizer que na MQL não se pode declarar um método virtual abstrato sem implementação. Na MQL, os métodos virtuais de uma classe base devem ter sempre uma implementação, que está repleta dos problemas que você mencionou.

Não tenho certeza por que você não pode declará-lo sem implementação? Os métodos de classe abstrata têm sido apoiados na MQL há anos.

 
Vasiliy Sokolov:

1. Na verdade, são muitos.

2. imho, seria uma terrível amálgama.

+ A chamada de métodos virtuais não é gratuita.

1. eu vou saber.

2. Vamos ver o que acontece, se eu conseguir acertar o que estou fazendo agora, vou postar no fórum).

Não de graça, sim. Qualquer solução OOP universal se revela cara, mas se seu propósito é construir com facilidade e beleza Expert Advisors e indicadores simples (sem características especiais), então vale a pena, imho.

 
Alexey Navoykov:

Não entendo realmente porque não se pode declarar sem implementação? Os métodos de classe abstrata têm sido apoiados na MQL há anos.

Porque uma entrada como esta causará um erro de compilação:

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 uma entrada como esta causará um erro de tempo de compilação:

E a pessoa achou impossível declarar tal método na MQL, tanto quanto eu entendi de seu posto.

 

Poucas pessoas sabem (ainda menos quem sabe e usa), mas asfunções puramente virtuais podem ter um corpo

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

Eles também têm que ser sobrecarregados na classe descendente

 
Ilyas:

Poucas pessoas sabem (ainda menos sabem e usam), masfunções puramente virtuais podem ter um corpo

Eles também têm que ser sobrecarregados na classe descendente

Então as interfaces ainda podem ter seu próprio código de método? Pode ser chamado de alguma forma? )

Acabei de me deparar com isto recentemente...

 
Hmm, característica interessante... Presumo que esta seja uma implementação padrão, que pode ser chamada em descendentes como A::f2(). ou seja
class B : public A
{
  virtual int f2() { return A::f2(); }
};
p.s. Eu tentei agora... Mesmo que A::f2() não tenha corpo, o compilador não reage a tal chamada. Isto é, eu tenho que pegar um erro mais tarde no tempo de execução. De jeito nenhum.
 
Alexey Navoykov:
Hmm, característica interessante... Acho que é um método padrão, apenas para chamá-lo em descendentes de A::f2().

Testado - você está certo em geral =)

Alexey Navoykov:
p.s. Embora eu tenha tentado agora... Mesmo que A::f2() não tenha corpo, o compilador não reage a tal chamada.
Reagi com "estouro de pilha" )

Aparentemente é uma barata, afinal de contas.

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


Razão: