我正在尝试扩展基类并收到以下错误:
类'DerivedProduct'错误地扩展了基类'BaseProduct'。
类型具有私有属性“ route”的单独声明。
基本类别:
export class BaseProduct {
constructor(private route: ActivatedRoute, private store: Store<fromState>){}
}
派生类:
export class DerivedProduct extends BaseProduct {
constructor(private route: ActivatedRoute, private store: Store<fromState>){}
}
为什么会出现此错误?
答案 0 :(得分:7)
字段已经在基类中声明,因此您无需重新声明它们(即,无需指定修饰符)。构造函数参数应该只是派生类中的参数,而不是字段中的参数。您还需要调用super
构造函数
export class BaseProduct {
constructor(private route: ActivatedRoute, private store: Store<fromState>) { }
}
export class DerivedProduct extends BaseProduct {
constructor(route: ActivatedRoute, store: Store<fromState>) {
super(route, store)
}
}
注意,您可以使用构造函数参数为字段语法糖添加额外的字段,但通常不应重新声明基本字段。如果重新声明公共字段和受保护字段,但不会重新声明私有字段,通常不会导致问题。
如果要访问派生类中的那些字段,请将修饰符更改为基类中的protected
或public
。
修改
@ series0ne指出,如果您对构造函数没有任何额外的逻辑,则可以将其全部省略,因为它将继承自基类:
export class BaseProduct {
constructor(private route: ActivatedRoute, private store: Store<fromState>) { }
}
export class DerivedProduct extends BaseProduct {
}
new DerivedProduct(route, store); //Works, also Angular should see it like this as well.
答案 1 :(得分:1)
在这两个构造函数中,您都在route参数上使用了关键字 private 。 private route: ActivatedRoute
。
当您使用private
关键字时,实际上是在说构造函数中的参数也是您的类的成员。因此BaseProduct
有一个成员route
,并且您也在DerivedProduct
中声明了相同的成员,这就是您遇到错误的原因。
解决方案
在BaseProduct
中设置路由受保护
export class BaseProduct {
constructor(protected route: ActivatedRoute, protected store: Store<fromState>){}
}
然后在派生类中,不要使用private关键字,而是将参数传递给super
类。
export class DerivedProduct extends BaseProduct {
constructor(route: ActivatedRoute, store: Store<fromState>){
super(route, store);
// this.route.doWhateverYouWantWithIt(this.store);....
}
}
您将同时作为基类和派生类中的类成员访问route
和store
。