八葉の日記

日々、感じたことをまとめる場として利用する

負の継承への対応

■前置き
オブジェクト指向言語では、継承がサポートされているが、継承には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件) を見る