Структура против пространства имен для проектирования на основе компонентов C ++ - PullRequest
2 голосов
/ 02 августа 2010

У нас есть компонентный дизайн C ++, где каждый компонент состоит из открытого внешнего класса, который используется для группировки интерфейсов компонентов.Каждый интерфейс определен как вложенный класс, как показано ниже.

struct ComponentContainer {

    class InterfaceClass_1 : public ComponentInterface {
        public:
        virtual ~InterfaceClass_1 ()              = 0;
        virtual InterfaceClass_1* GetInterface()  = 0;
        virtual void InterfaceMethod1 ()          = 0;
        virtual void InterfaceMethod2 ()          = 0;
    };

    class InterfaceClass_2 : public ComponentInterface {
        public:
        virtual ~InterfaceClass_2 ()             = 0;
        virtual InterfaceClass_2* GetInterface() = 0;
        virtual void InterfaceMethod1 ()         = 0;
        virtual void InterfaceMethod2 ()         = 0;
    };
};

Мой первый вопрос: правильно или не рекомендуется использовать класс в качестве контейнера для компонента?Правильнее ли заменить "struct ComponentContainer" на "пространство имен ComponentContainer"?

Так как классы интерфейса всегда общедоступны, я думал об изменении структуры, чтобы она выглядела следующим образом:

namespace ComponentContainer {

    struct InterfaceClass_1 : ComponentInterface {
        virtual ~InterfaceClass_1 ()              = 0;
        virtual InterfaceClass_1* GetInterface()  = 0;
        virtual void InterfaceMethod1 ()          = 0;
        virtual void InterfaceMethod2 ()          = 0;
    };

    struct InterfaceClass_2 : ComponentInterface {
        virtual ~InterfaceClass_2 ()             = 0;
        virtual InterfaceClass_2* GetInterface() = 0;
        virtual void InterfaceMethod1 ()         = 0;
        virtual void InterfaceMethod2 ()         = 0;
    };
};

Является ли этот метод определения компонента предпочтительным для моего первого примера?Есть ли какие-то фундаментальные недостатки, на которые мне нужно обратить внимание?

Спасибо.

1 Ответ

3 голосов
/ 02 августа 2010

Основные различия между методами struct и namespace:

  • Метод struct требует, чтобы все классы интерфейса содержались в одном и том же файле.Пространство имен может быть добавлено в несколько файлов.Другими словами: у вас может быть несколько файлов, расширяющих пространство имен ComponentContainer, что вы не можете сделать со структурой
  • Кто-то может попытаться создать экземпляр структуры-оболочки и что-то с ней сделать.У кого-то может даже возникнуть желание добавить функциональность в структуру обертывания
  • Вы можете использовать операторы "using" в пространстве имен - я не уверен, будет ли это на самом деле работать для структуры.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...