Читать книгу Angular - Manfred Steyer - Страница 39

Klassenvererbung

Оглавление

Anstatt ein Interface zu implementieren, kann eine Klasse auch von einer Basisklasse erben. Im Zuge dessen übernimmt die erbende Klasse sämtliche Eigenschaften und Methoden von der Basisklasse. Basisklassen werden auch als Superklassen und erbende Klassen dementsprechend als Subklassen bezeichnet.

Als Beispiel für eine Basisklasse kommt in Beispiel 2-16 die Klasse Person zum Einsatz:

Beispiel 2-16: Basisklasse Person

// src/app/ts/person.ts

export class Person {

id: number = 0;

firstName: string = '';

lastName: string = '';

fullName() {

return this.firstName + ' ' + this.lastName;

}

}

export class Passenger extends Person {

passengerStatus: string = '';

}

export class Pilot extends Person {

licenseNumber: string = '';

}

Diese Klasse unterscheidet sich zunächst nicht von herkömmlichen Klassen. Allerdings erben die Klassen Passenger und Pilot von ihr. Dazu erwähnen sie die Person in ihrer extends-Klausel. Genau das macht Person in diesem Kontext zur Basisklasse.

Ähnlich wie andere Mainstream-Sprachen erlaubt TypeScript keine Mehrfachvererbung. Eine Klasse kann also immer nur von einer anderen erben.

Durch die extends-Klausel übernehmen Passenger und Pilot sämtliche Felder und Methoden von Person. Zur Veranschaulichung ergänzen beide jeweils ein zusätzliches Feld. Ähnlich wie beim Einsatz von Interfaces lassen sich Instanzen von Subklassen zu Variablen der Superklasse zuweisen. Durch die Vererbung hat die Subklasse auf jeden Fall eine zur Superklasse kompatible Struktur.

Ein Beispiel dafür findet sich in Beispiel 2-17. Sowohl der neue Passenger als auch der neue Pilot werden hier einer Variablen vom Typ Person zugewiesen:

Beispiel 2-17: Polymorphe Behandlung zweier Ausprägungen von Person

// src/app/ts/demo.ts

import { Passenger, Person, Pilot } from './person';

[...]

const person1: Person = new Passenger();

person1.firstName = 'Max';

person1.lastName = 'Muster';

const person2: Person = new Pilot();

person2.firstName = 'Jens';

person2.lastName = 'Wolkenmeyer';

const isPerson = person1 instanceof Person; // true

const isPassenger = person1 instanceof Passenger; // true

const isPilot = person1 instanceof Pilot; // false

console.debug('isPerson', isPerson);

console.debug('isPassenger', isPassenger);

console.debug('isPilot', isPilot);

Beachtenswert ist in Beispiel 2-17 auch der Einsatz des instanceof-Operators. Er prüft, ob ein Objekt zu einem gegebenen Klassentyp kompatibel ist. Da es sich bei person1 um einen Passagier handelt, ist sie natürlich kompatibel zur Klasse Passenger – oder anders ausgedrückt: Sie lässt sich den Variablen von Passenger zuweisen, auch wenn hierzu gegebenenfalls eine Type Assertion notwendig ist – siehe dazu den folgenden Abschnitt.

Sie ist jedoch durch die Vererbung auch kompatibel zu Person. Da ein Passagier jedoch kein Pilot ist – ihm fehlt in diesem Beispiel zumindest die Eigenschaft licenseNumber –, liefert die letzte Prüfung ein false.

Angular

Подняться наверх