mql5におけるOOP、テンプレート、マクロ、微妙な使い分け - ページ 8 123456789101112131415...28 新しいコメント Vasiliy Sokolov 2019.01.25 14:31 #71 Alexey Navoykov:標準ライブラリの ことでしょうか?)いや、MQLでは実装のない抽象的な仮想メソッドを宣言することはできないということです。MQLでは、ベースクラスの仮想メソッドは必ず実装を持たなければならず、ご指摘のような問題をはらんでいます。 Vasiliy Sokolov 2019.01.25 14:34 #72 Ilya Malev:C#には基本的なベーシックインターフェイスがあまりない実はたくさんあるんです。 イリヤ・マレフ悪いことばかりではない、と私は思っています。C#の基本的なメインインターフェイスはそれほど多くなく、それらのメソッドを1つの基本的なスーパークラスに還元して、必要なものを継承することができると私は考えています(私はC#の専門家ではありません)。 追伸:<<<>>>のような構文で複数のものを実装するのは、ちょっと面倒です。例えば、a==b は a.compareto( b ) を、a[comparer]==b は comparer.compare(a,b) を呼び出すなど、演算子を通して関数を実行する方がよいでしょう。 イマイチ、ひどい寄せ集めになりそうです。+ 仮想メソッドの呼び出しは無料ではありません。 Alexey Navoykov 2019.01.25 14:45 #73 Vasiliy Sokolov:いや、MQLでは実装のない抽象的な仮想メソッドを宣言することはできないということです。MQLでは、ベースクラスの仮想メソッドは必ず実装を持たなければならず、ご指摘のような問題をはらんでいます。実装しないと宣言できない理由がよくわからないのですが?抽象クラスメソッドは、何年も前からMQLでサポートされています。 Ilya Malev 2019.01.25 14:47 #74 Vasiliy Sokolov:1.実は、たくさんあるんです。 2.イマイチ、ひどい寄せ集めになりそう。+ 仮想メソッドの呼び出しは無料ではありません。1.分かるようになる 2.どうなることやら、今やっていることがなんとかうまくいけば、フォーラムに投稿します)。 タダではありません、はい。汎用的なOOPソリューションは高価ですが、シンプルなExpert Advisorやインジケータを(特別な機能なしに)簡単に美しく構築することを目的とするならば、その価値はあると思います。 Ilya Malev 2019.01.25 15:04 #75 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; } Alexey Navoykov 2019.01.25 15:11 #76 Ilya Malev:なぜなら、このようなエントリーはコンパイル時のエラーの原因になるからです。そして、その方は、私がその投稿から理解した限りでは、MQLでそのようなメソッドを宣言することは全く不可能だと考えて いたようです。 Ilyas 2019.01.25 15:31 #77 知っている人は少ない(知っていて使っている人はさらに少ない)ですが、純粋仮想関数が 本体 class A { public: virtual int f1() = 0; virtual int f2() = 0 { return(0); } }; また、子孫クラスでオーバーロードされる必要があります。 Ilya Malev 2019.01.25 15:34 #78 Ilyas:知っている人は少ない(知っていて使っている人はもっと少ない)ですが、純粋な仮想関数が 本体 また、子孫クラスでオーバーロードされる必要があります。では、インターフェースはまだ独自のメソッドコードを持つことができるのですか?何とかなりませんか?) ちょうど最近、これに出会ったんです...。 Alexey Navoykov 2019.01.25 15:51 #79 これはデフォルトの実装で、A::f2()として子孫から呼び出せるようになっているんですね。class B : public A { virtual int f2() { return A::f2(); } }; p.s. 今試してみたのですが、A::f2()にボディがなくてもコンパイラは反応しません。 つまり、後でランタイムでエラーをキャッチしなければならないのです。 ありえない。 Ilya Malev 2019.01.25 15:54 #80 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()); } 123456789101112131415...28 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
標準ライブラリの ことでしょうか?)
いや、MQLでは実装のない抽象的な仮想メソッドを宣言することはできないということです。MQLでは、ベースクラスの仮想メソッドは必ず実装を持たなければならず、ご指摘のような問題をはらんでいます。
C#には基本的なベーシックインターフェイスがあまりない
実はたくさんあるんです。
悪いことばかりではない、と私は思っています。C#の基本的なメインインターフェイスはそれほど多くなく、それらのメソッドを1つの基本的なスーパークラスに還元して、必要なものを継承することができると私は考えています(私はC#の専門家ではありません)。
追伸:<<<>>>のような構文で複数のものを実装するのは、ちょっと面倒です。例えば、a==b は a.compareto( b ) を、a[comparer]==b は comparer.compare(a,b) を呼び出すなど、演算子を通して関数を実行する方がよいでしょう。イマイチ、ひどい寄せ集めになりそうです。
+ 仮想メソッドの呼び出しは無料ではありません。いや、MQLでは実装のない抽象的な仮想メソッドを宣言することはできないということです。MQLでは、ベースクラスの仮想メソッドは必ず実装を持たなければならず、ご指摘のような問題をはらんでいます。
実装しないと宣言できない理由がよくわからないのですが?抽象クラスメソッドは、何年も前からMQLでサポートされています。
1.実は、たくさんあるんです。
2.イマイチ、ひどい寄せ集めになりそう。
+ 仮想メソッドの呼び出しは無料ではありません。1.分かるようになる
2.どうなることやら、今やっていることがなんとかうまくいけば、フォーラムに投稿します)。
タダではありません、はい。汎用的なOOPソリューションは高価ですが、シンプルなExpert Advisorやインジケータを(特別な機能なしに)簡単に美しく構築することを目的とするならば、その価値はあると思います。
なぜ実装しないと宣言できないのか、よくわからないのですが?抽象クラスメソッドは、何年も前からMQLでサポートされています。
なぜなら、このようなエントリーがあると、コンパイルエラーが発生するからです。
なぜなら、このようなエントリーはコンパイル時のエラーの原因になるからです。
そして、その方は、私がその投稿から理解した限りでは、MQLでそのようなメソッドを宣言することは全く不可能だと考えて いたようです。
知っている人は少ない(知っていて使っている人はさらに少ない)ですが、純粋仮想関数が 本体
また、子孫クラスでオーバーロードされる必要があります。
知っている人は少ない(知っていて使っている人はもっと少ない)ですが、純粋な仮想関数が 本体
また、子孫クラスでオーバーロードされる必要があります。
では、インターフェースはまだ独自のメソッドコードを持つことができるのですか?何とかなりませんか?)
ちょうど最近、これに出会ったんです...。
p.s. 今試してみたのですが、A::f2()にボディがなくてもコンパイラは反応しません。 つまり、後でランタイムでエラーをキャッチしなければならないのです。 ありえない。
うーん、面白い機能だ... A::f2() の子孫で呼び出すだけで、デフォルトメソッドなんだろうなぁ。
テストしてみました - 一般的には正しいです =)
p.s.ですが、今試してみたところ、A::f2()にbodyがなくても、コンパイラは何も反応しませんでした。
どうやら結局ゴキブリらしい・・・。