Дочерний класс следует структуре родительского класса

#javascript #node.js #oop #ecmascript-6 #es6-class

#javascript #node.js #ооп #ecmascript-6 #es6-class

Вопрос:

У меня есть следующие два класса:

 class AcceptCommand extends Command {
    init(client, db) {
        super.init(client, db);
    }


    async hasPermission() {

    }

    async run() {
        if (this.hasPermission()) {

        }
    }
}
  

и

 export class Command {
    init(client, db) {
        this.client = client;
        this.db = db;
    }

    setTrigger(trigger) {
        this.trigger = trigger;
    }

    getTrigger() {
        return this.trigger;
    }

    async hasPermission() {

    }

    async run() {
        if (this.hasPermission()) {

        }
    }
}
  

Я хочу, чтобы при запуске функции run () она сначала проверяла, есть ли у пользователя разрешения ( this.hasPermission() ).

В родительском классе Command я делаю:

 async hasPermission() {

}

async run() {
    if (this.hasPermission()) {

    }
}
  

Есть ли способ заставить это также применяться ко всем дочерним классам без необходимости делать то же самое в каждом дочернем классе одинаково?

Комментарии:

1. Обратите внимание, что вы захотите использовать, if (await this.hasPermission()) учитывая, что hasPermission это async метод

Ответ №1:

Вы можете добавить другой метод, который будет выполнен, если hasPermission возвращает true. И переопределяет эту функцию в дочернем классе. Вот так:

 class Command {
    actionIfHasPermission () {
    	console.log('Command actionIfHasPermission')
    }

    async hasPermission() {
        console.log('Command hasPermission')
        return false
    }

    async run() {
        if (this.hasPermission()) {
            this.actionIfHasPermission()
        }
    }
}

class AcceptCommand extends Command {   		
    actionIfHasPermission() {
    	console.log('AcceptCommand actionIfHasPermission')
    }

    async hasPermission() {
    	console.log('AcceptCommand hasPermission')
        return true
    }
}

const instance = new AcceptCommand()

instance.run()