我有一个扩展另一个类的类。例如:
class Store extends BehaviorSubject {
constructor(obj) {
super(obj)
}
}
我还有更多类扩展Store
。
我需要的是一种隐藏BehaviorSubject
超类的一些属性的方法,例如next()
方法。
class SomeStore extends Store {
}
// I want to hide from this class some methods, properties
// That exists on the BehaviorSubject class.
const s = new SomeStore();
有办法做到这一点吗?
答案 0 :(得分:3)
没有。您可以覆盖子类中的方法来执行其他操作(或者不执行任何操作),但这违反了Liskov Substitution原则。
如果您的Store类不是BehaviorSubject,并且不像一个,则扩展不正确。在这种情况下,Store应该包含BehaviorSubject的私有实例,如果需要,通过“代理”它们来公开它的一些方法/属性。
答案 1 :(得分:2)
您可以编写类似下面代码的内容。也没有继承,这很好。通过构造函数传递Store
对象是实现DIP (dependency inversion principle)的一种方法。它本身很好,因为它解耦了类,也使StoreWrapper
可以测试。
<强>代码强>
export class StoreWrapper {
constructor(private _store: Store) { }
// Expose things that you think are okay to expose...
getValue = this._store.getValue;
onCompleted = this._store.onCompleted;
onError = this._store.onError;
onNext = this._store.onNext;
// Anything that is not exposed similar to how it is done above, will be hidden
// next = this._store.next;
}
<强>用法强>
const originalStore = ...; // <--- this is your original `Store` object.
const wrappedStore = new StoreWrapper(originalStore);
const value = wrappedStore.getValue();
// ... and so on
重要提示:
this._store.next()
内调用StoreWrapper
,但此代码并未违反LSP。换句话说,它不会破坏应该使用继承的方式。StoreWrapper
课程,以防它增长并获得一些“肉”(逻辑)。