Software Lab

상속 위반 본문

코드 리펙토링

상속 위반

아임코더 2022. 7. 4. 14:30
class Soldier{                   //abstract class

    public virtual void move();
    public virtual void attack();
    public virtual void heal();    
}


class Marine extends Soldier{

    public override void move(){   /*구현 필요*/   }
    public override void atttack(){   /*구현 필요*/   }
    public override void heal(){   /*구현 불필요*/   }
}


class Firebat extends Soldier{

    public override void move(){   /*구현 필요*/   }
    public override void atttack(){   /*구현 필요*/   }
    public override void heal(){   /*구현 불필요*/   }
}


class Medic extends Soldier{

    public override void move(){   /*구현 불필요*/   }
    public override void atttack(){   /*구현 불필요*/   }
    public override void heal(){   /*구현 불필요*/   }
}

<개선 전>

 

class Soldier{                       //abstract class

    public virtual void move();    
}


class AttackSoldier extends Soldier{

    public virtual void attack();
}


class Marine extends AttackSoldier{

    public override void move(){   /*구현 필요*/   }
    public override void attack(){   /*구현 필요*/   }
}


class Firebat extends AttackSoldier{

    public override void move(){   /*구현 필요*/   }
    public override void attack(){   /*구현 필요*/   }
}


class Medic extends Soldier{

    public override void move(){   /*구현 필요*/   }
    public void heal(){   /*구현 필요*/   }
}

<개선 후>

 

 

게임 스타크래프트에서 공격용인 Marin과 Firebat, 그리고 간호용인 Medic 이렇게 3종류의 군인이 있다.
이것들의 클래스를 설계해 보자.

<개선 전> - 추상 클래스 Solider로부터 상속받아 Marin, Firebat, Medic을 만들었다. 각각 attack, move, heal 함수를 오버 라이딩하여 기능을 구현하였다. 그런데 Marin, Firebat은 attack과 move의 동작하는 함수를 제공하지만, heal은 동작이 없는 빈 껍데기의 함수만 제공한다. Medic 또한 heal과 move의 동작하는 함수를 제공하지만, attack은 동작이 없는 빈 껍데기의 함수만 제공한다.
이것은 상속 위반이다. 이렇게 설계하면 클래스의 동작을 이해하기 어렵고, 추후 결함이 발생할 가능성이 크다.

<개선 후> - 추상 클래스 Solider로부터 상속받아 추상 클래스 AttackSoldier를 한 개 더 두었다.
이것을 상속받은 Marin, Firebat은 attack과 move의 동작하는 함수만 제공하면 되고,
Medic 또한 Solider로부터 상속받기 때문에 heal과 move의 동작하는 함수만 제공하면 된다. 이렇게 상속 위반을 하지 않게 할 수 있다.

'코드 리펙토링' 카테고리의 다른 글

중복 사용되는 코드 묶기  (0) 2022.07.05
추상화  (0) 2022.07.05
var, let, const 차이  (0) 2022.07.04
회전  (0) 2022.07.01
변수가 사용되는 함수 개수 줄이기  (0) 2022.07.01
Comments