Mixins - TypeScript

O TypeScript, assim como muitas linguagens orientadas a objetos, como Java ou C#, não permite o uso direto de herança múltipla. Podemos implementar múltiplas interfaces em uma classe, mas só podemos herdar de uma única classe. No entanto, a funcionalidade dos mixins permite, parcialmente, herdar propriedades e métodos de duas ou mais classes simultaneamente.

Vamos considerar um exemplo. Suponha que temos uma classe Animal, que representa um animal, e uma classe Movable, que representa um meio de transporte. Ambas as classes possuem sua funcionalidade única, que permite executar as tarefas para as quais foram projetadas. Além disso, suponha que temos uma classe que representa um cavalo. Por um lado, o cavalo é um animal e herda todas as características inerentes a um animal; por outro lado, o cavalo também pode ser usado como um meio de transporte. Portanto, para criar tal classe, seria útil herdar tanto da classe Animal quanto da classe Movable. Vamos resolver essa tarefa na linguagem TypeScript:

class Animal {
    feed(): void {
        console.log("Feeding the animal");
    }
}

class Movable {
    speed: number = 0;
    move(): void {
        console.log("Moving");
    }
}

class Horse {}

interface Horse extends Animal, Movable {}

function applyMixins(derivedCtor: any, baseCtors: any[]) {
    baseCtors.forEach(baseCtor => {
        Object.getOwnPropertyNames(baseCtor.prototype).forEach(name => {
            derivedCtor.prototype[name] = baseCtor.prototype[name];
        });
    });
}

applyMixins(Horse, [Animal, Movable]);

let pony: Horse = new Horse();
pony.feed();
pony.move();

Para que a classe Horse possa herdar os métodos das classes Animal e Movable, definimos uma interface homônima Horse, que estende as interfaces Animal e Movable:

interface Horse extends Animal, Movable {}

Mas para que o mixin possa herdar a funcionalidade, isso não é suficiente. Ainda precisamos usar uma função especial que copia a funcionalidade das classes pai para o mixin:

function applyMixins(derivedCtor: any, baseCtors: any[]) {
    baseCtors.forEach(baseCtor => {
        Object.getOwnPropertyNames(baseCtor.prototype).forEach(name => {
            derivedCtor.prototype[name] = baseCtor.prototype[name];
        });
    });
}

Em seguida, aplicamos essa função:

applyMixins(Horse, [Animal, Movable]);

O primeiro parâmetro é a classe mixin, e o segundo parâmetro é um array das classes aplicadas.

Política de Privacidade

Copyright © www.programicio.com Todos os direitos reservados

É proibida a reprodução do conteúdo desta página sem autorização prévia do autor.

Contato: programicio@gmail.com