Читать книгу Angular - Manfred Steyer - Страница 41
Abstrakte Klassen
ОглавлениеManche Basisklassen sollen lediglich Felder und Methoden für Subklassen vorgeben, jedoch selbst nicht als Vorlage für Objekte dienen. Ein Beispiel dafür ist die Klasse AbstractAddress in Beispiel 2-18. Sie wurde mit dem Schlüsselwort abstract versehen.
Beispiel 2-18: Abstrakte Basisklasse
// src/app/ts/address.ts
export abstract class AbstractAddress {
id: number = 0;
street: string = '';
zipCode: string = '';
city: string = '';
constructor(id: number) {
this.id = id;
}
fullAddress(): string {
return this.street + ', ' + this.zipCode + ' ' + this.city;
}
abstract toCSV(): string;
}
Das Schlüsselwort abstract verhindert nicht, dass andere Klassen von dieser Klasse erben können. Allerdings unterbindet es die Nutzung des new-Operators zur Erzeugung einer neuen Instanz von AbstractAddress. Die Anweisung
const a = new AbstractAddress(7); // FEHLER
ist somit nicht zulässig.
Wie dieses Beispiel zeigt, können abstrakte Klassen auch abstrakte Methoden haben. Das sind Methoden, die nur eine Signatur, aber keine Implementierung aufweisen. Demzufolge müssen erbende Klassen sie implementieren (sofern diese nicht auch abstrakt sind). Ein Beispiel dafür ist die CompanyAddress (siehe Beispiel 2-19), die von AbstractAddress erbt und eine Implementierung für die abstrakte Methode toCSV liefert:
Beispiel 2-19: Erben von abstrakter Basisklasse
// src/app/ts/company-address.ts
import { AbstractAddress } from './address';
export class CompanyAddress extends AbstractAddress {
companyName: string = '';
toCSV() {
return `${this.id};${this.companyName};${this.street};${this.zipCode};
${this.city}`;
}
}
Der Vollständigkeit halber zeigt Beispiel 2-20 den Einsatz der CompanyAddress:
Beispiel 2-20: CompanyAddress instanziieren
// src/app/ts/demo.ts
import { CompanyAddress } from './company-address';
[...]
const a1 = new CompanyAddress(1);
a1.id = 1;
a1.city = 'Graz';
a1.street = 'Hier';
a1.zipCode = '8010';
a1.companyName = 'Steh & Schau GmbH';
console.debug('a1 as csv', a1.toCSV());
console.debug('a1 as full Address', a1.fullAddress());