負の継承への対応
■前置き
オブジェクト指向言語では、継承がサポートされているが、継承には2種類存在する。
・正の継承:Liskovの置換原則を守る継承
・負の継承:上記を守れないような継承
親クラスで定義されたモノは、継承関係で共通の領域とみなされる。これを侵害するようなことを指す。
負の継承の例
struct strrecvfd { #ifdef KERNEL union { struct file*fp; int fd; } #else int fd; #endif unsigned short uid; unsigned short gid; char util[8]; }
KERNELのシンボルの指定が基本である場合、KERNEL以外の場合には、負の可変性が生じている。
生じているのは、"fpが存在するという共通性が不要をされていること"です。
KERNELのシンボルの指定が基本である場合でない場合でも、負の可変性が生じている。
生じているのは、"fdの性質減っている"ことです。KERNELがない場合はfdのみで十分でしたが、KERNELの場合は、fd+fpで、もともとの
fdと同じ役割を果たしますので、fdの役割が一部減っています。
解決策を順にあげていく。
①負の継承に沿ってドメインをサブドメインに切り分ける。
②テクニックを用いる
①についてですが、上記の例では、
struct strrecvFP { union { struct file*fp; int fd; } unsigned short uid; unsigned short gid; char util[8]; } struct strrecvFD { int fd; unsigned short uid; unsigned short gid; char util[8]; }
②のテクニックについては、別途まとめます。
親子で明確に意味が異なるような場合は、テクニックでなんとかすのではなく、クラスをわけるというのが
正解かもしれない。
多分、②でなんとかできるのは"コードの再利用"の観点から継承を使用しているケースに限られるのではないかなと思う。
- 作者: ジェームス・O・コプリン,James O. Coplien,平鍋健児,金沢典子,羽生田栄一
- 出版社/メーカー: ピアソン桐原
- 発売日: 2009/12/01
- メディア: 単行本
- 購入: 3人 クリック: 41回
- この商品を含むブログ (6件) を見る