mql5におけるOOP、テンプレート、マクロ、微妙な使い分け - ページ 8

 
Alexey Navoykov:
標準ライブラリの ことでしょうか?)

いや、MQLでは実装のない抽象的な仮想メソッドを宣言することはできないということです。MQLでは、ベースクラスの仮想メソッドは必ず実装を持たなければならず、ご指摘のような問題をはらんでいます。

 
Ilya Malev:

C#には基本的なベーシックインターフェイスがあまりない

実はたくさんあるんです。

イリヤ・マレフ

悪いことばかりではない、と私は思っています。C#の基本的なメインインターフェイスはそれほど多くなく、それらのメソッドを1つの基本的なスーパークラスに還元して、必要なものを継承することができると私は考えています(私はC#の専門家ではありません)。

追伸:<<<>>>のような構文で複数のものを実装するのは、ちょっと面倒です。例えば、a==b は a.compareto( b ) を、a[comparer]==b は comparer.compare(a,b) を呼び出すなど、演算子を通して関数を実行する方がよいでしょう。

イマイチ、ひどい寄せ集めになりそうです。

+ 仮想メソッドの呼び出しは無料ではありません。
 
Vasiliy Sokolov:

いや、MQLでは実装のない抽象的な仮想メソッドを宣言することはできないということです。MQLでは、ベースクラスの仮想メソッドは必ず実装を持たなければならず、ご指摘のような問題をはらんでいます。

実装しないと宣言できない理由がよくわからないのですが?抽象クラスメソッドは、何年も前からMQLでサポートされています。

 
Vasiliy Sokolov:

1.実は、たくさんあるんです。

2.イマイチ、ひどい寄せ集めになりそう。

+ 仮想メソッドの呼び出しは無料ではありません。

1.分かるようになる

2.どうなることやら、今やっていることがなんとかうまくいけば、フォーラムに投稿します)。

タダではありません、はい。汎用的なOOPソリューションは高価ですが、シンプルなExpert Advisorやインジケータを(特別な機能なしに)簡単に美しく構築することを目的とするならば、その価値はあると思います。

 
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()にbodyがなくても、コンパイラは何も反応しませんでした。
スタックオーバーフロー "で反応しました。)

どうやら結局ゴキブリらしい・・・。

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


理由: