참고
설명
- 클래스와 인터페이스의 이름을 동일하게 사용하여 믹스인을 구현하는 기법
- 인터페이스는 다중 상속이 되므로, 클래스에는 상속하지 않고 인터페이스에 클래스를 다중 상속하여 마치 클래스에서 다중상속이 된 것처럼 구현한다.
예제
class Disposable {
isDisposed! : boolean;
dispose() {
this.isDisposed = true;
console.log("Set disposed.");
}
}
class Activatable {
isActive! : boolean;
activate() {
this.isActive = true;
console.log("Set activated.");
}
deactivate() {
this.isActive = false;
console.log("Set deactivated.");
}
}
interface SmartObject extends Disposable, Activatable {}
class SmartObject {
constructor() {}
}
function applyMixins(derivedCtor : any , baseCtors: any[]) {
baseCtors.forEach((baseCtor) => {
Object.getOwnPropertyNames(baseCtor.prototype).forEach((name) => {
Object.defineProperty(
derivedCtor.prototype,
name,
Object.getOwnPropertyDescriptor(baseCtor.prototype, name) || Object.create(null)
);
})
})
}
applyMixins(SmartObject, [Disposable , Activatable]);
let smartObj = new SmartObject();
smartObj.activate();
smartObj.deactivate();
smartObj.dispose();