Как избежать циклической зависимости, когда базовый класс добавляет расширенный класс? - PullRequest
0 голосов
/ 28 апреля 2020

Я использую класс, который расширяет класс контейнера. Каждый экземпляр класса сам по себе является контейнером, но контейнер верхнего уровня не является экземпляром класса.

Файл 1

const Command = require('Command');
class CommandManager {
    constuctor () {
        this.commands = {};
    }
    add (object) {
        const command = new Command(object);
        this.commands[command.name] = command;
    }
    get (string) {
        return this.commands[string];
    }
}

Файл 2

const CommandManager = require("CommandManager");
class Command extends CommandManager {
    constructor (object) {
        super();
        //Other-code
    }
    // Class Methods
}

Во время выполнения это должно выглядеть примерно так:

client.commands = new CommandManager();
client.commands.add(object); // Add function also filters down adding to sub elements

Или:

const command = client.commands.get(string);
command.add(object);

Проблема состоит в том, что хотя бы один из этих файлов заканчивается пустым объектом или не определен из требуемый класс. Мои попытки следовать другим решениям для круговой зависимости узлов не сработали (или я их неправильно понял).

Цель состоит в том, чтобы сохранить 2 класса в своих собственных файлах, и я знаю, что могу решить проблему используя тот же файл (но это было бы исключением в проекте?), и я не уверен, как я (или потребитель) мог бы go требовать его логически, поскольку они находятся в разных областях.

Так, что я могу go об этом, что мне не хватает?

1 Ответ

0 голосов
/ 28 апреля 2020

Согласно комментарию, опубликованному Берги:

Создание ленивого запроса в файле CommandManager задерживает загрузку модуля и позволяет разрешить зависимость до его вызова.

class CommandManager {
    constuctor () {
        this.commands = {};
    }
    add (object) {
        const Command = require('Command');
        const command = new Command(object);
        this.commands[command.name] = command;
    }
    get (string) {
        return this.commands[string];
    }
}
...