Как шаблон Decorator работает в C ++ - PullRequest
0 голосов
/ 22 мая 2018

Надеюсь, это не дубликат, и извините за мой не идеальный английский.

Я пытаюсь понять, как именно работает шаблон декоратора в c ++.

Я использую эта реализация найдена в сети, и дизайн мне понятен.

Что я не могу понять, так это то, как технически это работает.

Когда я создаю новый объекти украшая его, например:

AbstractNPC *goblin1= new Elite(new Shaman(new NPC("Goblin")));

Тип goblin1 будет Elite, Shaman, NPC или как?

И как функция render () "берет" реализацию реализациидругие классы и использовать их вместе?

Я ожидаю, что когда я вызываю render (), я рекурсивно вызываю функции из других классов декораторов, используя эту инструкцию:

NPCDecorator::render();

Тем не менееэто не имеет смысла для меня.

Как и почему это работает?

1 Ответ

0 голосов
/ 22 мая 2018

соответствующий тип goblin1 прямо в объявлении, AbstractNPC *.

NPCDecorator реализует этот абстрактный класс, удерживая еще один экземпляр этого абстрактного класса.В выражении new Elite(new Shaman(new NPC("Goblin"))) есть три AbstractNPC экземпляра, два декоратора и "нормальный" экземпляр.

Когда виртуальный вызов render поступает в первый декоратор, он делаетэто вещи, затем вызовите его базовые классы render, которые просто делегируют декорированному члену npc.

У вас будет стек вызовов вроде:

Elite::render
{
    // this == Elite * @ 0x12345678
    cout << "Elite ";
    NPCDecorator::render
    {
        Shaman::render
        {
            // this == Shaman * @ 0x56781234
            cout << "Shaman ";
            NPCDecorator::render
            {
                NPC::render
                {
                    // this == NPC * @ 0x78563412
                    cout << name; // "Goblin"
                }
            }
        }
    }
}
...