(HASHIMOTO SOFTWARE CONSULTING)トップ
技術コラム
第3回:『科学的モデリング』継承③〜『継承される特性(プロパティ)』
第3回の話題〜継承は何を継承するのか?
今回のコラムの話題は『継承される特性(プロパティ)』についてです。
「そもそもサブクラスはスーパークラスからどのような特性(プロパティ)を継承するのか?」という疑問に回答し説明します。
『科学的モデリング』の視点から継承される特性(プロパティ)を明確にして、今後の連載コラムの中で正確に継承の意味を探ります。
継承は全ての特性(プロパティ)を継承する
継承される特性(プロパティ)を説明するときに利用する【図3-1】のような簡単なUMLのモデルを考えます。
操作(メソッド/関数)の継承
JavaやC++などの特定のプログラム言語の固有の仕様は別にして、オブジェクト指向設計の概念では、
スーパークラスの特性(プロパティ)は「全て」がサブクラスに継承されます。
【図3-1】を見るとサブクラス「person」はスーパークラス「animal」から全ての属性と操作(メソッド/関数)を継承しています。
継承により全ての属性と操作(メソッド/関数)がサブクラスに継承されることは良く知られています。
【図3-1】のサブクラス「person」のグレー色で表示されている特性(プロパティ)が、継承されたことを示しています。
UMLではサブクラスがスーパークラスから継承する特性(プロパティ)をオーバーライドしない場合は、表記しない規則があります。
しかし、科学的に正確に継承を検討時には必要になる事ですので、本コラムでは表示して解説していきます。
関連、関連端(ロール名)および多重度の継承
【図3-2】を見るとサブクラス「person」はスーパークラス「animal」から関連「pair」を継承してい
ます。それに伴い関連端(ロール名)である「male」「female」も継承されていることが分かります。
そして、関連の両端の多重度も継承されています。【図3-2】のサブクラス「person」の関連がグレー色で表示されていて、スーパークラス「animal」か
ら関連「pair」が継承されたことを示しています。
関連の制約の継承
【図3-3】を見るとサブクラス「person」はスーパークラス「animal」から関連「pair」、関連端(ロール名)「male」「female」そして、関連の両端の多重度も継承していますが、関連「pair」の制約
{symmetry}、関連端(ロール名)の制約{immutable}も継承しています。なお多重度も制約の1種です。
【図3-3】のサブクラス「person」の関連の制約{symmetry}および関連端(ロール名)の制約{immutable}がグレー色で表示されていて、スーパークラス「animal」から継承されたことを示しています。
なお、{symmetry}は、関連に参加する両側のオブジェクトから見て、この関連の意味が対称的であることを示す制約です。また、{immutable}は、関連でつながるオブジェクトが変更できないことを示す制
約です。今回のコラムでは、この制約{symmetry}と{immutable}の意味については、分からなくても結構です。関連の制約、関連端(ロール名)の制約も継承されることを理解して頂ければ結構です。
【図3-4】は関連端をクラスの属性として表示させた図です。【図3-4】においてステレオタイプ≪ A≫ は
関連属性であることを示しています。ただし、ステレオタイプ≪ A≫ はUMLで標準で定義されているステ
レオタイプではありません。
サブクラス「person」はスーパークラス「animal」から関連属性を継承していることが分かります。
初期値とデフォルト・パラメーターの継承
【図3-5】のクラス「animal」の属性「age」に初期値「0」が付与されています。また、操作(メソ
ッド/関数)である「setAge(int newAge):void」に、デフォルト・パラメーター「0」が付与されています。
また、サブクラス「person」はスーパークラス「animal」から属性「age」の初期値「0」と
「setAge(int newAge):void」に、デフォルト・パラメーター「0」が継承されていることが分かります。
クラス不変条件の継承
【図3-6】ではクラス「animal」の属性「age」に制約{age>=0 and age <150}が付与されています。属性「gender」に制約{gender==” male” or gender ==” female”}が付与されています。
この2つの属性の制約は「不変条件」と呼ばれるものです。
【図3-6】では第4番目の区画に「クラス不変条件」を表示しています。
クラス「animal」の「クラス不変条件」は、属性「age」の制約{age>=0 and age <150}と属性「gender」の制約{gender==” male” or gender ==” female” }の2つであることが分かります。
サブクラス「person」は、スーパークラス「animal」から属性「age」と属性「gender」を継承していますが、その際に2つの属性の制約である「不変条件」も継承します。
属性の制約である「不変条件」とクラス全体の制約である「クラス不変条件」は、クラスのインスタン
スが常に満たさなければならない制約です
次回以降のコラムで「不変条件」と「クラス不変条件」について詳細に解説しますので、今回のコラム
では「不変条件」と「クラス不変条件」も継承される特性(プロパティ)であることが理解できればOKです
操作の「事前条件(pre-condition)」と「事後条件(post-condition)」の継承
【図3-7】ではクラス「animal」の操作(メソッド/関数)「setAge(int newAge =0) : void」に
「Pre-condition(newAge >=0 and newAge <150)」と「Post-Condition((age >=0 and age <150) and (age == newAge))」付与されています。
この操作(メソッド/関数)の2つの制約は「事前条件(pre-condition)」「事後条件(post-condition)」と呼ばれるものです
サブクラス「person」は、スーパークラス「animal」から操作(メソッド/関数)「setAge(int newAge = 0) : void」を継承していますが、同時にこの操作(メソッド/関数)の「事前条件(pre-
condition)」と「事後条件(post-condition)」である、ぞれぞれ「Pre-condition(newAge >=0 and newAge <150)」と「Post-Condition((age >=0 and age <150) and (age == newAge))」も継承しています。
「事前条件(pre-condition)」と「事後条件(post-condition)」は、各操作(メソッド/関数)に付与される制約であり、各操作(メソッド/関数)の実行時に満たすことが必要な制約です
「事前条件(pre-condition)」「事後条件(post-condition)」についても、今後のコラムの中で詳しく解説します。
関連の限定子(qualifier)の継承関連に付く限定子(qualifier)も継承されます。
まとめ&次回
今回のコラムは『継承される特性(プロパティ)』について扱いました。
注意点はプログラム言語によっては、その言語の継承メカニズムの都合で特性(プロパティ)が自動的
に継承されない言語もあります。今回のコラムの解説は特定のプログラム言語を意識していませんからオ
ブジェクト指向設計に一般的な概念の議論となります。
少し先になりますが、JavaやC++など特定の言語で特性(プロパティ)を継承する具体的なコード例も
示したいと思います。
それから、次回以降のコラムでサブクラスがスーパークラスから継承した特性(プロパティ)のオーバ
ーライドについても解説します。特性(プロパティ)は、ある条件を満たすならばオーバーライドが可能
です。特性(プロパティ)のオーバーライドの方法と、特性(プロパティ)をオーバーライドすること
が、どのような意味を持つのかについて次回以降のコラムで解説します。