abstract class

Klasa bazowa, której nie można utworzyć bezpośrednio, z metodami do uzupełnienia przez potomków.

Na tej stronie

Przykład

#
TypeScript
abstract class Exercise {
  constructor(public title: string) {}

  abstract check(answer: string): boolean

  run(answer: string): string {
    return `${this.title}: ${this.check(answer) ? 'poprawnie' : 'spróbuj jeszcze raz'}`
  }
}

class QuestionExercise extends Exercise {
  constructor(title: string, private correct: string) {
    super(title)
  }

  check(answer: string): boolean {
    return answer.trim().toLowerCase() === this.correct
  }
}

const task = new QuestionExercise('Znacznik akapitu', 'p')
console.log(task.run(' P '))
console.log(task.run('div'))
Wynik
Znacznik akapitu: poprawnie
Znacznik akapitu: spróbuj jeszcze raz

Definicja i zastosowanie

#

Klasa abstrakcyjna to szablon dla innych klas. Nie można utworzyć jej obiektu przez new, można ją tylko rozszerzyć. Może zawierać zwykłe metody z kodem i metody abstrakcyjne, które mają tylko sygnaturę.

Każda klasa pochodna musi zaimplementować wszystkie metody abstrakcyjne. Kompilator tego pilnuje, więc wspólna logika zostaje w klasie bazowej, a szczegóły w potomkach.

W odróżnieniu od interfejsu klasa abstrakcyjna może zawierać działający kod i pola. Jeśli potrzebujesz tylko kontraktu bez implementacji, wystarczy interfejs.

Składnia

#
Składnia
abstract class Nazwa {
  abstract metoda(): typ
  zwyklaMetoda() { … }
}

Więcej przykładów

#
Nie można utworzyć klasy abstrakcyjnej
TypeScript
const generic = new Exercise('Coś')
// Błąd: Cannot create an instance of an abstract class.

Dobre praktyki

#
  • Klasa abstrakcyjna sprawdza się, gdy potomkowie dzielą dużo wspólnego kodu. Przy samym kontrakcie wybierz interfejs.
  • Nie buduj długich łańcuchów dziedziczenia. Często prostsza jest kompozycja funkcji lub obiektów.

Powiązane hasła

#

Widzisz błąd albo brakuje przykładu? Napisz do nas.