Это приемлемый подход или, скорее, каждый отдельный компонент должен иметь свою собственную реализацию ngOnDestroy?
Допустимо, это просто вопрос мнения, но я бы решительно не поощряйте такой подход по следующей причине:
@Component({...})
export class MyComponent extends BaseComponent implements OnDestroy {
public ngOnDestroy() {
// do work
}
}
export class BaseComponent implements OnDestroy {
public ngOnDestroy() {
// never executed
}
}
В приведенном выше примере не выдано предупреждение TypeScript о том, что метод super никогда не выполняется, и поэтому я хотел бы вызвать его anti-pattern .
Кроме того, в будущем у вас будет искушение для добавления дополнительных хуков жизненного цикла, таких как OnInit
, в базовый класс.Для этого вам придется искать всех потомков , чтобы убедиться, что они вызывают super.ngOnInit()
.
Хотя это может показаться более трудоемким, но это безопаснее использовать инкапсуляцию.
export class BaseComponent implements OnDestroy {
public ngOnDestroy() {
// do work
}
}
@Component({...})
export class MyComponent implements OnDestroy {
private readonly _base: BaseComponent = new BaseComponent();
public ngOnDestroy() {
this._base.ngOnDestroy();
}
}
В сети много статей о плюсах / минусах инкапсуляции и наследования.На самом деле это длительное обсуждение в информатике, и некоторые языки программирования не поддерживают наследование именно из-за проблем.Наверное, я пытаюсь сказать, что это широкая тема и вопрос личного выбора для вас, но отчасти поэтому вы задали этот вопрос.
https://www.developer.com/design/article.php/3525076/Encapsulation-vs-Inheritance.htm