Si tengo dos clases, ¿es posible crear una tercera clase que amplíe ambas?
abstract class A { name age protected abstract print() } abstract class B { name age } // class C needs to inherit from both of the above classes class C extends A , B { }Sí, dependiendo de los requisitos hay varias formas de hacerlo. Dadas las clases A y B :
class A { constructor(public i: number){} foo() { return 123; } } class B { constructor(public name: string){} bar() { return "Hello from B!"; } }puede hacer cualquiera de las siguientes y hacer que simplemente funcione (por algún valor de solo trabajo):
Herede una clase, implemente la otra como una interfaz (en TypeScript, cualquier clase puede tratarse como una interfaz):
class Cv1 extends B implements A { /* implement A-as-interface here */ } Cree un alias de tipo para A & B e implemente el alias de tipo (por ejemplo, trate ambas clases como interfaces):
type AandB = A & B; class Cv2 implements AandB { constructor(public i: number, public name: string) {} foo(...args: []) { return A.prototype.foo.apply(this, args); } bar() { return "Cv2 says GOODBYE!"; } }Mezcle ambas clases y herede de la clase mixta:
// Exercise for the reader: do it without any function mixin(a: any, b: any): any { // Choice: Should isA apply to either mixin? Should it apply to neither? const aNotB = Object.defineProperties(Object.create(a.prototype), Object.getOwnPropertyDescriptors(b.prototype)); const shadowClass: any = function shadowClass(){} shadowClass.prototype = aNotB; class mixinImpl extends shadowClass {} return mixinImpl; } class Cv3 extends mixin(A, B) { } Hay limitaciones con esta técnica. Por ejemplo, si B tiene una cadena de prototipos propia (p. ej., B extends BPrime y BPrime extends BPrimordial , etc.), ninguno de los métodos y propiedades de BPrime y BPrimordial se copiarán (puede recorrer la cadena de prototipos usted mismo en la clase tiempo de construcción para evitar esto si eso es lo que quiere hacer). Además, instanceof no funcionará con ninguno de los implements o técnicas .assign (por ejemplo anInstanceOfC instanceof B será false usando cualquiera de las técnicas anteriores).