Tengo una clase Heap que tiene un campo de values privados. Esto es bueno ya que no quiero que nadie pueda modificar values directamente.
class Heap { #values; constructor(array = []) { this.#values = array; } insert(item) { this.#values.push(item); this.#bubbleUp(this.#values.length - 1); } } Pero ahora me gustaría extender mi clase Heap a una subclase PriorityQueue. En esta clase necesito cambiar la firma de algunos de los métodos (por ejemplo insert ) para que asigne una prioridad a un valor. Sin embargo, no puedo averiguar cómo acceder al campo de values desde la clase base. Por ejemplo, dada la siguiente clase 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); } } Recibo un error al intentar insertar un valor en values .
¿Hay alguna forma de evitar este problema? Quiero hacer que un campo sea privado en la clase base, pero aún accesible para la subclase.
¡Gracias!
No puedo averiguar cómo acceder al campo de
valuesdesde la clase base.
Esto no es posible. Privado realmente significa privado en JS. No lo use si desea que el campo sea accesible fuera de la clase.
Quiero hacer que un campo sea privado en la clase base, pero aún accesible para la subclase.
Ese sería un miembro protegido, que JS no admite.
¿Hay alguna forma de evitar este problema?
Bueno, en realidad no necesitas acceder a los .#values . Todo lo que necesita hacer es llamar al método de insert de la clase base:
class PriorityQueue extends Heap { insert(item, priority) { super.insert({ item, priority }); } }Me gustaría extender mi clase
Heapa una subclasePriorityQueue. En esta clase necesito cambiar la firma de algunos de los métodos (por ejemplo insertar) para que asigne una prioridad a un valor.
Esta es una mala idea. Una subclase no debe cambiar las firmas del método, de lo contrario violará el principio de sustitución de Liskov . En su lugar, use la composición sobre la herencia , donde una cola de prioridad tiene o contiene un montón:
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.… } }