mql5中的OOP、模板和宏,细微之处和用途 - 页 8

 
Alexey Navoykov:
你指的是他们的标准库 吗?)

不,我的意思是,在MQL中,你不能声明一个没有实现的抽象虚拟方法。在MQL中,基类的虚拟方法必须始终有一个实现,这就充满了你提到的问题。

 
Ilya Malev:

在C#中没有很多基本的基础接口

事实上,有很多。

Ilya Malev:

在我看来,这并不全是坏事。在我看来,C#中没有那么多基本的主接口(我不是C#专家),你不能把它们的方法减少到一个基本的超类,然后继承你需要的东西。

P.S. 要想通过<<<<>>>> 这样的结构来实现一些多重的东西,是有点麻烦的。最好通过运算符来做函数,例如a==b调用a.compareto( b ),a[compareer]==b调用compareer.compare(a,b)等。

我认为,这将是一个可怕的混杂物。

+ 调用虚拟方法是不自由的。
 
Vasiliy Sokolov:

不,我的意思是,在MQL中,你不能声明一个没有实现的抽象虚拟方法。在MQL中,基类的虚拟方法必须始终有一个实现,这就充满了你提到的问题。

我不知道为什么你不能在没有实施的情况下声明它?多年来,MQL一直支持抽象类方法

 
Vasiliy Sokolov:

1.事实上,有很多这样的人。

2.我认为,这将是一个可怕的混杂物。

+ 对虚拟方法的调用是不自由的。

1.我就知道。

2.让我们看看会发生什么,如果我设法把我现在做的事情做好,我会在论坛上发表)。

不是免费的,是的。任何通用的OOP解决方案都是昂贵的,但如果你的目的是轻松和漂亮地建立简单的专家顾问和指标(没有特殊功能),那么它是值得的,我认为。

 
Alexey Navoykov:

我真的不明白为什么不执行就不能声明?多年来,MQL一直支持抽象类方法

因为像这样的条目会导致编译错误。

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:

因为像这样的条目会引起编译时的错误。

而那个人认为在MQL中根本不可能声明这样的方法,就我对他的帖子的理解 而言。

 

很少有人知道(知道并使用它的人更少),但纯虚拟的函数 可以有一个主体

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

它们也必须在子类中被重载

 
Ilyas:

很少有人知道(更少有人知道并使用),但纯粹的虚拟函数 可以有一个主体

它们也必须在子类中被重载

那么接口仍然可以有自己的方法代码?它能以某种方式被调用吗?)

最近刚看到这个...

 
嗯,有趣的功能......我认为这是一个默认的实现,可以在后代中作为A::f2()调用,即。
class B : public A
{
  virtual int f2() { return A::f2(); }
};
p.s. 我现在试了一下......即使A::f2()没有主体,编译器也不会对这样的调用做出反应。 也就是说,我必须在以后的运行时间中捕捉到一个错误。 没办法。
 
Alexey Navoykov:
嗯,有趣的功能......我猜这是一个默认的方法,只是在A::f2()的后代中调用它。

测试了一下--你总体上是对的=)

阿列克谢-纳沃伊科夫
p.s. 虽然我现在已经试过了......即使A::f2()没有主体,编译器对这样的调用也没有反应。
我的反应是 "堆栈溢出" )

显然,这毕竟是一只蟑螂......

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


原因: