Angular 8
Таким образом, цель расширения базового класса заключается в том, чтобы у дочерних классов были методы, предоставляемые родительским классом. Тем не менее, базовый класс нуждается в некоторых инъекциях различных услуг. Эти услуги не нужны классам Chind. Пример:
// The parent class which will be extended by the many children
export class parentClass {
constructor(private service1: service1Service) {
}
protected action1(): any {
return this.service1.someFunc();
}
public action2(): any {
return this.service1.someFunc2();
}
}
// One of the child classes which doesn't care about service1Service, but is required to inject it anyway...
export class childClass extends parentClass {
constructor(service1: service1Service) {
super(service1);
}
public doSomething() {
const data = this.action1();
// bla bla bla
}
}
Итак, большая проблема в том, что каждый дочерний класс должен внедрить этот сервис service1Service, даже если он им вообще не нужен.
Мой вопрос: есть ли способ внедрить сервисы внутри родительского класса, не требуя, чтобы их вводили внутри ребенка? Пример выше очень упрощен. В реальной ситуации в родительский класс будет введено около 5 служб. Родительский класс будет использоваться разными членами команды, которым действительно не нужно заботиться об используемых там службах, потому что они строят свои собственные классы поверх родительского класса и используют родительские методы для извлечения данных или выполнения вычислений.
Я знаю, что может быть один полу-хороший вариант:
import { Injector } from '@angular/core';
export class parentClass {
constructor(private injector: Injector) {}
protected action1(): any {
const s1 = this.injector.get(service1Service);
return s1.someFunc();
}
}
import { Injector } from '@angular/core';
export class childClass extends parentClass {
constructor(injector: Injector) {
super(injector);
}
}
Таким образом, дети должны знать только, чтобы ввести Injector и передать его родительскому конструктору. Но я все еще хочу еще более чистое решение, если это возможно.