トップ  >  リファレンス  >  基本  >  オブジェクト指向プログラミング  >  型のカプセル化と拡張性
スポンサーリンク
検索
カスタム検索
リファレンスツリー
オススメ
型のカプセル化と拡張性


OOPはソフトウェアを書くのにバランスが取れています。
データと動作が一体化されています。
このカプセル化はユーザー定義のデータ型を作成し、言語データ型を拡張し、それらと相互作用します。
型の拡張は、言語に使い易いユーザー定義のデータ型だけでなく、基本型を追加するチャンスです。

抽象データ型は、stringを例に説明する事ができます。
ユーザーは、stringが連結または出力する等の文字列操作の特定の動作を持っている事を知っています。
連結や出力等の操作はメソッドと呼ばれます。

ADTの特定の実装は、例えばstringの長さ制限等のいくつかの制限を有する事が出来ます。
これらの制限は全ての動作に影響を与えます。
同時に、内部またはプライベート実装の詳細は直接ユーザーがオブジェクトを見る方法には影響しません。
例えば、stringはよく配列として実装され、この配列の名前や内部ベースアドレスはユーザーには必要ではありません。

カプセル化はユーザー定義型へのオープンインタフェースが提供された時に実装の詳細を隠す機能です。
MQL4はC++のように、クラスと構造体の定義(classstruct)はprivate、protected、publicのアクセスキーワードを持ったカプセル化規定に使用されます。

publicキーワードは、キーワードの後のメンバがアクセス制限無くオープンである事を示します。
このキーワードを指定しなかった場合、クラスのメンバはデフォルトでロックされます。
privateメンバはそのクラスのメンバ関数からのみアクセス出来ます。

protectedクラスの関数は、このクラスだけでなく継承クラスからも利用可能です。
publicクラスの関数は、クラス宣言の範囲内の関数で利用可能です。
保護はクラスの実装の一部を隠す事が出来ます、従ってデータ構造における予期せぬ変更を防止します。
アクセス制限やデータ隠蔽はオブジェクト指向プログラミングの特徴です。

通常、クラス関数は保護され、protected修飾子で宣言され、
値の読み書きはpublicアクセス指定子によって定義された特殊なSetメソッド・Getメソッドを使用して行われます。



例:
class CPerson {

protected:
   string            m_name;                      // 名前

public:
   void              SetName(string n){m_name=n;} // 名前を設定(Setメソッド)
   string            GetName(){return (m_name);}  // 名前を取得(Getメソッド)

};



このアプローチはいくつかの利点があります。
まず関数名でそれが何をするか(クラスメンバの値をSet・Getする)を理解する事が出来ます。
次に、将来的にCPersonクラスまたはその派生クラスのいずれかでm_name変数の型を変更する必要が出てきます。

この場合、SetName()とGetName()関数の実装を変更するだけです。
CPersonクラスのオブジェクトはソースコードを変更せずにプログラムで使用する事が出来ます。
なぜならユーザーはm_nameのデータ型が変更された事を知る事が出来ないからです。


例:
// 姓名の構造体
struct Name {
   string            first_name;                 // 名前
   string            last_name;                  // 苗字
};
 
// 基本クラス
class CPerson {

protected:
   Name              m_name;                     // 姓名

public:
   void              SetName(string n);
   string            GetName(){ return( m_name.first_name +" "+ m_name.last_name );}

private:
   string            GetFirstName(string full_name);
   string            GetLastName(string full_name);
};
 
// 派生クラス
void CPerson::SetName(string n) {
   m_name.first_name = GetFirstName(n);
   m_name.last_name  = GetLastName(n);
}
 
string CPerson::GetFirstName(string full_name) {
   int pos = StringFind(full_name," ");

   if ( pos > 0 ) {
       StringSetCharacter(full_name,pos,0);
   }

   return(full_name);
}
 
string CPerson::GetLastName(string full_name) {
   string ret_string;
   int     pos = StringFind(full_name," ");

   if( pos > 0 ) {
       ret_string = StringSubstr(full_name , pos+1 );
   } else {
      ret_string  = full_name;
   }

   return(ret_string);
}


■関連コンテンツ:
データ型
スポンサーリンク



Copyright ©2015 MT4でEA自作しちゃお〜 All Rights Reserved.


Top

inserted by FC2 system