OOPはソフトウェアを書くのにバランスが取れています。
データと動作が一体化されています。
このカプセル化はユーザー定義のデータ型を作成し、言語データ型を拡張し、それらと相互作用します。
型の拡張は、言語に使い易いユーザー定義のデータ型だけでなく、
基本型を追加するチャンスです。
抽象データ型は、
stringを例に説明する事ができます。
ユーザーは、stringが連結または出力する等の文字列操作の特定の動作を持っている事を知っています。
連結や出力等の操作はメソッドと呼ばれます。
ADTの特定の実装は、例えばstringの長さ制限等のいくつかの制限を有する事が出来ます。
これらの制限は全ての動作に影響を与えます。
同時に、内部またはプライベート実装の詳細は直接ユーザーがオブジェクトを見る方法には影響しません。
例えば、stringはよく配列として実装され、この配列の名前や内部ベースアドレスはユーザーには必要ではありません。
カプセル化はユーザー定義型へのオープンインタフェースが提供された時に実装の詳細を隠す機能です。
MQL4はC++のように、クラスと構造体の定義(
classと
struct)は
private、
protected、
publicのアクセスキーワードを持ったカプセル化規定に使用されます。
publicキーワードは、キーワードの後のメンバがアクセス制限無くオープンである事を示します。
このキーワードを指定しなかった場合、クラスのメンバはデフォルトでロックされます。
privateメンバはそのクラスのメンバ関数からのみアクセス出来ます。
protectedクラスの関数は、このクラスだけでなく
継承クラスからも利用可能です。
publicクラスの関数は、クラス宣言の範囲内の関数で利用可能です。
保護はクラスの実装の一部を隠す事が出来ます、従ってデータ構造における予期せぬ変更を防止します。
アクセス制限やデータ隠蔽はオブジェクト指向プログラミングの特徴です。
通常、クラス関数は保護され、
protected修飾子で宣言され、
値の読み書きは
publicアクセス指定子によって定義された特殊なSetメソッド・Getメソッドを使用して行われます。
このアプローチはいくつかの利点があります。
まず関数名でそれが何をするか(クラスメンバの値をSet・Getする)を理解する事が出来ます。
次に、将来的にCPersonクラスまたはその派生クラスのいずれかでm_name変数の型を変更する必要が出てきます。
この場合、SetName()とGetName()関数の実装を変更するだけです。
CPersonクラスのオブジェクトはソースコードを変更せずにプログラムで使用する事が出来ます。
なぜならユーザーはm_nameのデータ型が変更された事を知る事が出来ないからです。