타입스크립트(자바스크립트)나 자바 같은 몇몇 언어들은 상속의 복잡성과 명확성을 해친다는 이유로 다중 상속을 지원하지 않는다. 다중 상속을 사용할 경우 객체 간의 상속 관계가 복잡해질 수도 있으며 책임에 따른 객체를 만드는데에도 많은 생각이 필요해지며 일부 메서드의 필요로 인해 불필요한 상속이 일어날 수도 있다. 하지만 반대로 단일 상속이란 제약으로 인해 객체의 재사용성에 한계가 느껴지는 경우도 존재한다.이러한 상황에 믹스인 패턴을 사용하여 객체를 조합시켜 다중상속과 비슷한 객체 패턴을 생성할 수 있다.
믹스인 패턴 구성하기
가상 어항을 운영하는 게임을 만든다고 가정하자. 프로토타입에서는 가상 어항에서 기를 수 있는 생명체로 오징어, 게, 거북이 단 3종류만을 기를 수 있다.이제 우리는 생명체의 행동을 구현하는 코드를 구현해야한다. 조건은 다음과 같다.
이중 상속을 해결하기 위해 이동방향에 따른 Mixin 클래스 생성 함수를 만들어준다.
해당 함수들은 인자로 받은 생성자 함수(클래스)를 상속하는 서브클래스 생성자 함수를 반환한다. 이를 통해서 다중 상속과 비슷한 패턴을 구현한다.
1classSquidextendsVerticalMoveMixin(Creature){}23classCrabextendsHorizontalMoveMixin(Creature){}45classTurtleextendsVerticalMoveMixin(HorizontalMoveMixin(Creature)){}67constsquidActive=()=>{8const squid =newSquid();910 squid.moveBottom();11 squid.moveTop();12 squid.eat();13};1415constcrabActive=()=>{16const crab =newCrab();1718 crab.moveLeft();19 crab.moveRight();20 crab.eat();21};2223constturtleActive=()=>{24const turtle =newTurtle();2526 turtle.moveBottom();27 turtle.moveTop();28 turtle.moveLeft();29 turtle.moveRight();30 turtle.eat();31};3233squidActive();// top bottom eat!34crabActive();// left right eat!35turtleActive();// top bottom left right eat!36