【超入門】MQL5 EA講座 第51回「クラスについて4 -派生クラス-」【EAの作り方】

MQL5でEA作ろう講座

前回クラスにおけるアクセス指定子 について解説しました。

改めて前回の内容をおさらいをしておくと、

ということをお伝えしました。

今回は 派生クラス についてお話ししたいと思います。

※その前に。

ここまで3回にわたってクラスについての解説をしてきましたが、これまでの内容は押さえていますでしょうか?

「微妙だなー((+_+))」という部分があれば、以下のリンクで復習していただければと思います

スポンサーリンク
スポンサーリンク

派生クラスとは?

クラスの大きな特徴の1つに、

継承(inheritance)

という概念があります。

継承とは?

継承を簡単に言うと、特定のクラスの機能を引き継ぎつつ、さらに新しい機能をクラスに追加できる機能です。

このような、特定のクラス継承したクラス派生クラスと言います。

現時点ではピンとこないかもしれませんが、大丈夫です。コードの具体歴を見ていきながらゆっくりと理解していきましょう。

派生クラスの作り方

前回のアクセス指定子の記事でも、派生クラスの作り方については簡単に触れました。

classキーワード→ 派生クラス名 →コロン(:) →public 派生元のクラス

という記述手順を踏んで派生クラスは作られます。↓

//クラスの宣言
class exampleClass
{
   protected:
   //アクセスレベルprotectedのメンバー変数「protectedVariable」を宣言
   int protectedVariable;
   
   public:
 //アクセスレベルpublicのメンバー変数「publicVariable」を宣言
   int publicVariable;
//アクセスレベルpublicのメンバー関数「publicFunction1」を宣言
   int publicFunction1(){return protectedVariable;};
//アクセスレベルpublicのメンバー関数「publicFunction2」を宣言
   void publicFunction2(){Print(protectedVariable);};
};


//派生クラスの宣言
class derivedClass : public exampleClass
{

}

上のサンプルコード記述によって、exampleClassを継承した派生クラスderivedClassが誕生しました。

注目してほしいのは、この時点では派生クラスderivedClassにはメンバを一切記述していないことです。

//派生クラスの宣言
class derivedClass : public exampleClass
{

}

じゃあ、これからメンバを書き込んでいかないと、derivedClassは何も機能しないのか?

というとそんなことはなくて、exampleClassを継承しているので、exampleClassのメンバが使えるようになっています。(privateレベル以外)

class exampleClass
{
   protected:
   //アクセスレベルprotectedのメンバー変数「protectedVariable」を宣言
   int protectedVariable;
   
    public:
 //アクセスレベルpublicのメンバー変数「publicVariable」を宣言
   int publicVariable;
//アクセスレベルpublicのメンバー関数「publicFunction1」を宣言
   int publicFunction1(){return protectedVariable;};
//アクセスレベルpublicのメンバー関数「publicFunction2」を宣言
   void publicFunction2(){Print(protectedVariable);};
};


//派生クラスの宣言
class derivedClass : private exampleClass
{
  /* ↓実際はこれらのexampleClassメンバーにアクセスできる!
  protected:
   int protectedVariable;
   
   public:
   int publicVariable;
   int publicFunction1(){return protectedVariable;};
   void publicFunction2(){Print(protectedVariable);};
  */
  
};

派生クラスderivedClassは{}内にメンバの記述をしていなくても、exampleClassから継承を受けているので、実際は↑のサンプルコードで/**/マルチラインコメントアウトしている部分のメンバを実装しています。

下記の動画は、メンバを一切記述していない状態の派生クラスから継承元のメンバを呼び出している様子です。OnStart関数から無事exampleClassのメンバを呼び出せているのがわかると思います。↓

派生クラスの拡張性について

このように、派生クラスを作ることによって、継承元のメンバを使えるようになるわけですが、派生クラスは自分のメンバを追加してさらにクラスの機能を拡張することができます。

//クラスの宣言
class exampleClass
{
   protected:
   //アクセスレベルprotectedのメンバー変数「protectedVariable」を宣言
   int protectedVariable;
   
   public:
   //アクセスレベルpublicのメンバー変数「publicVariable」を宣言
   int publicVariable;
    //アクセスレベルpublicのメンバー関数「publicFunction1」を宣言
   int publicFunction1(){return protectedVariable;};
    //アクセスレベルpublicのメンバー関数「publicFunction2」を宣言
   void publicFunction2(){Print(protectedVariable);};
};


//派生クラスの宣言
class derivedClass : public exampleClass
{
  public:
  //アクセスレベルpublicのメンバー変数「derivedVariable」を宣言
  double derivedVariable;
   //アクセスレベルpublicのメンバー関数「derivedFunction」を宣言 
  double derivedFunction(){return derivedVariable;}
  
};

derivedClassにメンバ「derivedVariable」とメンバ「derivedFunction」を追加しました。

見た目上はderivedClassには、2つのメンバしかないように見えますが、先述した通りexampleClassのメンバ継承しているので、derivedClassからは6つのメンバが呼び出せます。

おまけ

前回と今回の講座を通じて、アクセス指定子には2パターンあることに気づかれましたでしょうか?

すなわち、

(1)アクセス指定子には基本クラスメンバに対して用いるものと、

(2)派生クラス宣言時に用いるもの

です。

classキーワード→ 派生クラス名 →コロン(:) →private→派生元のクラス

という記載順で派生クラスを作った場合、継承したメンバアクセスレベルは全てprivateになります。

↓の動画を見るとわかるように、publicの時は通っていたコンパイルprivateに変えるとアクセス権消失でエラーになっています

この原理は、protected にも同様に適用されます。

派生クラスの宣言時、

classキーワード→ 派生クラス名 →コロン(:) →protected →派生元のクラス

とすると、

継承したメンバアクセスレベルは全てprotected になります。

じゃあ、public にするとどうなるか・・・というと、継承したメンバアクセスレベルは基本クラスアクセスレベルをそのまま引き継ぎます。これが最もオーソドックスな使い方になります。

というより、継承元のメンバアクセスレベルprivateprotectedに変更するメリットを差し当たっては思いつきません。

派生クラスを作る際は、素直にアクセス指定子publicにして作りましょう。

まとめ

今回は 派生クラス について解説しました。

今回の記事では以下のことを学びました

派生クラスの具体的な使い方については↓

MQL5 EA講座 第109回「インジケータの値を簡単に取得できるクラスを作る」

MQL5 EA講座 第110回「インジケータ取得クラスに派生クラスを追加する」

で確認する事ができます。

今回は以上になります。

最後までお読みいただきありがとうございました<m(__)m>

【超入門】MQL5 EA講座 第50回「クラスについて3 -アクセス指定子-」【EAの作り方】

【超入門】MQL5 EA講座 第52回「クラスについて5 -コンストラクタ-」【EAの作り方】

クラスの実際の使用例に関しては、今後の講座記事にはなりますが、以下の記事で解説していますので、今はよくわからなくてもご安心ください。

MQL5 EA講座 第71回「トレード用のオリジナルクラスを作る」

MQL5 EA講座 第82回「ポジション情報管理クラスを作る-その1」

MQL5 EA講座 第83回「ポジション情報管理クラスを作る-その2」

MQL5 EA講座 第88回「待機注文情報取得用のクラスを追加する」

MQL5 EA講座 第96回「トレーリングストップクラスを作る1」

MQL5 EA講座 第97回「トレーリングストップクラスを作る2」

MQL5 EA講座 第100回「ブレイクイーブンストップ関数を作る」

コメント

タイトルとURLをコピーしました