#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()