Angular 有没有办法扩展子组件';不需要调用super()就可以使用新的注入类创建构造函数?

Angular 有没有办法扩展子组件';不需要调用super()就可以使用新的注入类创建构造函数?,angular,inheritance,dependency-injection,abstract-class,Angular,Inheritance,Dependency Injection,Abstract Class,在Angular中,我有从父组件继承的子组件。此父组件注入多个类。我想用一个注入类扩展子组件,我不在父类中使用这个注入类。在此扩展之前,不需要实例化构造函数并调用super(*args*)。但是,当我尝试扩展构造函数时,会收到以下错误消息: 派生类的构造函数必须包含“super”调用 在使用注入扩展类时,是否有一种方法不需要调用超类?如果这个问题有什么不清楚的地方,请告诉我 父组件 @组件({模板:'}) 导出抽象类ParentComponent实现OnInit、OnDestroy{ 建造师(

在Angular中,我有从父组件继承的子组件。此父组件注入多个类。我想用一个注入类扩展子组件,我不在父类中使用这个注入类。在此扩展之前,不需要实例化构造函数并调用
super(*args*)
。但是,当我尝试扩展构造函数时,会收到以下错误消息:

派生类的构造函数必须包含“super”调用

在使用注入扩展类时,是否有一种方法不需要调用超类?如果这个问题有什么不清楚的地方,请告诉我

父组件

@组件({模板:'})
导出抽象类ParentComponent实现OnInit、OnDestroy{
建造师(
受保护的formBuilder:formBuilder,
受保护路由:激活的路由,
受保护的蛇形酒吧:Matsnakbar,
受保护位置:位置
) {
const routeParams=this.route.snapshot.params;
if(routeParams&&routeParams.id){
this.subjectId=this.route.snapshot.params.id;
}
}
}
子组件

导出类ChildComponent扩展了ParentComponent{ 建造师( /**我想延长以下服务*/ 受保护的myService:Service ) { //但在实例化这个构造函数时,我还需要使用所需的参数调用super() } } 问题扩展


延伸我的问题;我不确定双重导入超类参数并传递它是否是开销。这个问题的主要原因是,我试图保持代码尽可能干净,并试图克服重复的代码。为了在
super
调用中提供注入类而重复导入注入类感觉有点无用。

我想您害怕将所有东西注入到您的父级。这就是为什么你需要这种行为。恐怕没有这样的选择。您可以做的最好的事情是,所有组件都使用通用样式注入
Injector
,而不是其依赖项,然后通过Injector获取所有依赖项

 class Parent {
   private myService = this.injector.get(MyService)
     private myService2 = this.injector.get(MyService2)
   constructor(@Inject(INJECTOR) injector: Injector){}
}
class Child extends Parent {
 constructor(@Inject(INJECTOR) injector: Injector) {
 super(injector);
  }
}

如果父级在所有这些情况下都不是组件,那么您可以在其构造函数中省略
@INJECTOR(INJECTOR)

在阅读您的问题几次之后,我不确定是否理解了这一点,因此我将把它作为一个答案发布

您可以扩展父类并添加服务,但仍然需要调用父类的构造函数。这是不可避免的。您不需要重新注入任何内容,尽管您至少还需要声明它们

您孩子的构造函数应该如下所示:

constructor(
  formBuilder: FormBuilder,
  route: ActivatedRoute,
  snackBar: MatSnackBar,
  location: Location,
  protected myService: Service // note the "protected" here but not above
) {
  super(formBuilder, route, snackBar, location);
}

子构造函数的非受保护的参数本质上是“传递”,也就是说,传递给父构造函数关于应该注入什么的声明。没有什么是双重注射或类似的。

为什么叫super对你来说是个问题?也许有一种不同的解决方案可以实现您的目标。我认为没有办法,您必须将所有父依赖项注入子构造函数中,并使用super()将它们传递给父依赖项。在这种情况下,子依赖项将不会有
myService
myService 2
,对吗?不,它们是私有的。至少将它们标记为
受保护
,然后它们将在其所有子系统中可用。否,
private
很好。我想这就是OP想要的,继承父对象的其余属性,但不注入相同的服务。我认为问题作者不想在子对象中重新注入所有相同的服务,因此,protected只是这种情况下的最佳选择问题的目标确实是,如果您想要扩展父构造函数,是否需要调用父构造函数。而
no
是这个问题的有效答案。非常感谢。
 class Parent {
   private myService = this.injector.get(MyService)
     private myService2 = this.injector.get(MyService2)
   constructor(@Inject(INJECTOR) injector: Injector){}
}
class Child extends Parent {
 constructor(@Inject(INJECTOR) injector: Injector) {
 super(injector);
  }
}
constructor(
  formBuilder: FormBuilder,
  route: ActivatedRoute,
  snackBar: MatSnackBar,
  location: Location,
  protected myService: Service // note the "protected" here but not above
) {
  super(formBuilder, route, snackBar, location);
}