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