пользовательские объекты GUI - PullRequest
0 голосов
/ 22 марта 2011

в программе на C ++ у меня есть графики, в которые я хотел бы добавить несколько объектов.Это могут быть, например, обычные «автономные» объекты, такие как текст, строки и т. Д., Или более «умные» объекты разных типов, которые действуют по-разному и могут быть подключены к внешней модели для чтения / записи своего состояния.

Самое простое, что я имею в виду, это создание общего интерфейса для всех объектов с виртуальными функциями, такими как Draw() и т. Д., Но объекты могут существенно отличаться (как текстовое поле и полоса прокрутки различны и, следовательно, имеют другой интерфейс).С другой стороны, если я не создаю общий интерфейс, мне потребуется диспетчеризация типов объектов, что обычно считается плохой практикой в ​​C ++.

Все это должно быть простым дляпример создания виджетов и пользовательских очередей сообщений был бы излишним, но я хочу сделать что-то простое для поддержки / расширения.

Я знаю, что есть много шаблонов для GUI, таких как MVC, MVP и т. д., но они оченьВообще, и я немного растерялся, так что, если бы вы могли дать мне несколько указаний (или, что еще лучше, ссылку для вдохновения), это было бы полезно!Спасибо.

Ответы [ 2 ]

1 голос
/ 22 марта 2011

Одной из возможностей будет использование множественного наследования. Определите базовый класс drawable, который определяет только то, что достаточно для рисования видимого объекта, и требует, чтобы все ваши нарисованные объекты были производными от него. Они могут (часто будут) наследоваться и от других базовых классов, чтобы определять другие интерфейсы, которые они поддерживают; тот просто гарантирует, что каждый предмет может быть нарисован при необходимости.

1 голос
/ 22 марта 2011

Для гибкости и масштабируемости вы можете использовать интерфейсы вместо одного базового класса. Например, расширить все объекты, которые можно нарисовать из интерфейса IDraw. Если объекты могут быть обновлены, добавьте и реализуйте интерфейс IControl и так далее. Сначала это может выглядеть как накладные расходы, но предлагает хорошую масштабируемость.

Редактировать:

void* Class::GetInterface(const int id)
{
    if (IDraw::GetId() == id)
    {
        return (IDraw*)this;
    }
    else if (IControl::GetId() == id)
    {
        return (IControl*)this;
    }

    return NULL;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...