Sto cercando di seguire un libro di disegni di design C# scrivendo il mio codice in TypeScript. Forse questo è il mio primo errore, ma è un modo che mi piace imparare una lingua.Come si simula una classe astratta e si chiama il suo costruttore?
dattiloscritto non supporta la parola chiave abstract per le classi, quindi sto cercando di simulare. Forse questo è il mio secondo errore.
Ecco la mia interfaccia e classi:
interface IEngine {
getSize(): number;
getTurbo(): boolean;
}
class AbstractEngine implements IEngine {
constructor(private size: number, private turbo: boolean) {
throw "Abstract class";
}
public getSize(): number {
return this.size;
}
public getTurbo(): boolean {
return this.turbo;
}
public toString(): string {
var funcNameRegex = /function (.{1,})\(/;
var results = (funcNameRegex).exec(this.constructor.toString());
var className = (results && results.length > 1) ? results[1] : '';
return className + " (" + this.size + ")";
}
}
class StandardEngine extends AbstractEngine {
constructor(size: number) {
// not turbo charged
super(size, false);
}
}
Quando si tenta di creare un'istanza di un AbstractEngine con new AbstractEngine(1, true)
ottengo un errore "Estratto di classe" come previsto.
Quando si tenta di creare un'istanza di uno StandardEngine con new StandardEngine(9000)
Inoltre ottengo un errore "classe astratta".
C'è un modo per simulare una classe astratta a macchina, l'hanno in grado di essere istanziati, ma ancora chiamare eccellente in una classe che estende? E che dire della simulazione di metodi astratti, posso proteggerli e chiamare ancora il metodo super?
Ma devo essere in grado di condividere l'implementazione in AbstractEngine attraverso diverse classi concrete, non solo StandardEngine. Mi dispiace di non averlo reso evidente nel mio post. Non vedo come la tua soluzione aiuti a farlo. * edit * Ahh, non importa, la tua menzione della parte relativa ai mixin che porterebbe a condividere il codice tra più classi concrete. Dovrò fare un tentativo. – brycedarling
Dopo aver implementato questo utilizzando i mixin, sono un po 'deluso da quanto codice ho dovuto copiare su entrambe le classi StandardEngine e TurboEngine. Vorrei che ci fosse una parola chiave che si prendesse cura di questo e rimosso la necessità di chiamare applyMixins, o classi astratte, o entrambi. – brycedarling
Inoltre, il metodo toString personalizzato su Engine stampa sempre "Engine" per il nome della classe quando viene implementato come mixin invece di "StandardEngine" o "TurboEngine" come quando si utilizza l'ereditarietà. – brycedarling