Большинство языков ООП не предоставляют функцию, которую вы ищете.Как только метод переопределяется дочерним классом, невозможно обеспечить принудительное выполнение дочерней реализацией родительской реализации.В машинописи есть открытый вопрос , обсуждающий эту функцию.
Другой подход заключается в том, чтобы пометить реализацию ngOnDestroy для базового класса как final и дать baseКлассы метод подключения, чтобы позволить им делегировать логику разрыва.Например:
abstract class BaseComponent implements OnDestroy {
readonly subscriptions = new Array<Subscription>();
get model() { return … }
ngOnDestroy() {
for (let s of subscriptions) s.unsubscribe();
this.destroyHook();
}
// depending on your needs, you might want to have a default NOOP implementation
// and allow child classes to override it. That way you wont need to spread NOOP
// implementations all over your code
abstract protected destroyHook(): void;
}
class ChildClass extends BaseComponent {
protected destroyHook(){//NOOP}
}
К сожалению, ts не поддерживает эквивалент конечного логического банкомата .
Еще одним интересным моментом является тот факт,что эта ваша проблема возникает из-за того, как вы планируете управлять подписками на экземплярах компонентов.Есть действительно лучшие способы сделать это, один из них - взять элемент из исходных наблюдаемых до тех пор, пока компонент не будет уничтожен.Что-то вроде:
readonly observable$: Observable<string> = ....;
ngOnInit(){
observable$.pipe(takeUntil(/*this instance is destroyed*/)).subscribe(...)
}
Это может быть легко заархивировано с библиотеками, такими как this