我有一個具有私有values欄位的 Heap 類。這很好,因為我不希望任何人能夠直接修改values.
class Heap {
#values;
constructor(array = []) {
this.#values = array;
}
insert(item) {
this.#values.push(item);
this.#bubbleUp(this.#values.length - 1);
}
}
但是現在我想將我的 Heap 類擴展為 PriorityQueue 子類。在這個類中,我需要更改某些方法的簽名(例如insert),以便它為值分配優先級。但是,我無法弄清楚如何values從基類訪問該欄位。例如,給定以下 PriorityQueue 類:
class PriorityQueue extends Heap {
constructor(array = []) {
super(array);
}
insert(item, priority) {
// Error: Private field '#values' must be declared in an enclosing class
this.#values.push({ item, priority });
this.#bubbleUp(this.#values.length - 1);
}
}
嘗試將值推送到values.
有沒有辦法解決這個問題?我想將基類中的欄位設為私有,但子類仍可訪問。
謝謝!
uj5u.com熱心網友回復:
我無法弄清楚如何
values從基類訪問該欄位。
這不可能。Private 在 JS 中真正意味著私有。如果您希望該欄位可在課堂外訪問,請不要使用它。
我想將基類中的欄位設為私有,但子類仍可訪問。
那將是受保護的成員,JS 不支持。
有沒有辦法解決這個問題?
好吧,您實際上并不需要訪問.#values. 您需要做的就是呼叫基類insert方法:
class PriorityQueue extends Heap {
insert(item, priority) {
super.insert({ item, priority });
}
}
我想將我的
Heap類擴展為PriorityQueue子類。在這個類中,我需要更改某些方法的簽名(例如插入),以便為值分配優先級。
這是一個壞主意。子類不應更改方法簽名,否則將違反Liskov 替換原則。相反,在繼承上使用組合,其中優先級佇列具有或包含堆:
class PriorityQueue {
#heap = new Heap(v => v.priority); // assuming it takes a custom comparator?
push(item, priority) {
this.#heap.insert({ item, priority });
}
pop() {
return this.#heap.…
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/344648.html
標籤:javascript 班级 哎呀 私人的
上一篇:如何計算重復的物件屬性?
