継承

inheritance.png

サブクラス化による再利用はホワイトボックス再利用としてしばしば言及される
つまり、継承を用いれば親クラスの内部をサブクラスから見ることができる、という意味である。[5]

継承とは?

「モノの種類の共通点と相違点を体系的に整理する仕組み」
「似た者同士のクラスの共通点と相違点を整理する仕組み」
[2]
あるクラスの特性、機能を引き継ぎ、より「特殊な」クラスを作ること[7]

UML図

継承の利点

  • 重複したコードを減らすことができる
  • 複数のクラスに共通のプロトコル(通信方法)を提供する(親クラスをつかうことによって)
  • 親クラスを、引数、配列の型、戻り値 にすることにより、便利さを発揮する
    • 親クラスを戻り値の型にしておいて、実際にリターンするのは子クラスにしてもよい

便利な使い方の例を列挙

同じ配列に色々な子供たちを入れる

Animal myDog=new Dog();

同じ配列に、あらゆるキャラを入れることだって可能★
Animal [] animals=new Animal[5];
animals[0]=new Dog();
animals[1]=new Cat();
animals[2]=new Wolf();
animals[3]=new Hippo():
animals[4]=new Lion();

そして、すべての動物に一斉に命令できる
for(Animal animal:animals){
    animal.run();//みんな走れー!
}

戻り値の型は親にしておいて、実際は子供達をreturn する

/**
* @return カーダシアン家の誰か
*/
public Kardashian makeKardashian(int order){
        switch(order){
        case 0:
            return new Kourtney();//カーダシアン家の長女のコートニー
        case 1:
            return new Kim();//カーダシアン家の次女のキム
 
        default:
            return new Khloe();//カーダシアン家の三女のクロエ
        }
    }

継承のデメリット

  • あとでソースコードを見た時、親まで辿らなきゃならないのは面倒臭い、わかりにくい
  • 親クラスを変更すると、子クラスまでなしくずしてきにエラーになる

継承に頼ると、振る舞いはコンパイル時に静的に決まってしまいます。
つまり、スーパークラスが与えてくれる振る舞い化それをオーバーライドした振る舞いしか使えません。[4]
継承はコンパイル時に確定されるので、実行時に親クラスから継承した実装方法を変更することはできない。
親クラスがサブクラスの物理的な表現の一部を定義することがある。
継承は親クラスの実装の詳細をサブクラスに明らかにするため、継承は「カプセル化の概念を壊す」とも言われている。
親クラスの実装を変更すれば、サブクラスにも変更を強いることになる[5]

各言語と継承

Objective-Cでは単一継承しか許されない,多重継承は許されません

q?_encoding=UTF8&ASIN=4822284654&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=lifeiscool01-22 q?_encoding=UTF8&ASIN=0321563840&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=lifeiscool01-22 q?_encoding=UTF8&ASIN=4894714515&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=lifeiscool01-22

composition reuse

サポートサイト Wikidot.com compositionreuse