Tengo una clase base en ES6 como esta:
class BasePlot { props = { 'data': [] } constructor() { // do things but don't setup data } draw(data){ if (data && data.length ) this.props.data = data; // Q: how to exit here if height and width are not yet available? this.setScale() this.setAxis() } setDimensions(height, width) { this.props.height = height; this.props.width = width; } } La clase nunca se instanciará directamente, sino que se usará solo para la herencia.
Además del constructor, todos los demás métodos pueden llamarse en un orden impredecible, es por eso que en el método de draw no quiero continuar si la height y el width aún no están definidos para la instancia.
Simplemente podría agregar una condición if y salir, pero eso no es lo que tenía en mente.
En una clase secundaria, llamo al draw principal así:
class RectPlot extends BasePlot{ draw(data){ super.draw(data); // DON'T EXECUTE if height and width are not set // rest of the code } } En este caso, cuando llamo al draw secundario, primero llamo al método principal y, en caso de que la height y el width aún no estén configurados, me gustaría salir (regresar) del método principal pero TAMBIÉN del secundario.
Lo que quiero decir es algo como esto:
// Parent draw(data){ if (data && data.length ) this.props.data = data; if(this.props.height && this.props.width) this.setScale() this.setAxis() return true } else return false } } // Child draw(data){ if(super.draw(data)){ // proceed w rest of the code } else return false } Esto es exactamente lo que me gustaría hacer, excepto que no quiero verificar con un if en todas las subclases si el draw principal se completó con éxito.
P: ¿Hay alguna manera de "salir antes" de un método padre Y un método hijo además de la repetición antes mencionada del bloque if - else en todas las clases de niños?
No puede regresar de un método de llamada desde dentro de un método llamado. Sin embargo, podrías evitar el problema por completo...
Un diseño alternativo podría ser crear otro método, digamos drawCanvas por ejemplo, de la siguiente manera...
class BasePlot { props = { data: [], }; draw(data) { if (data && data.length) this.props.data = data; if (this.props.height && this.props.width) this.drawCanvas(data); } drawCanvas(data) { this.setScale(); this.setAxis(); } } class RectPlot extends BasePlot { drawCanvas(data) { super.drawCanvas(data); // other stuff } } Luego anularía drawCanvas en lugar de draw , sabiendo que solo se llama drawCanvas si existen width y height .
Estoy de acuerdo en que verificar el valor devuelto de super.draw(data) , como en su ejemplo, no es lo ideal. Sería fácil olvidarse de esta comprobación, lo que daría lugar a posibles errores. Tampoco es obvio para el lector de la implementación de la clase secundaria por qué se requiere esta verificación sin mirar la implementación de la clase base.