Цепное наследование

0

В настоящее время у меня есть два класса: Drawable и Transformable, и такие вещи, как Actors, наследуют оба из них, проблема заключается в том, что при рисовании объектов на экране я повторяю вектор Drawable, который не имеет функции getPosition(), включенной в Transformable. Добавление виртуального getPosition() в Drawable разрешает это, но затем создает проблему неоднозначных вызовов функции в другом месте. Могу ли я нарисовать наследуемый Transableable и Actor наследовать Drawable и получить тот же результат, как если бы он наследовал оба класса?

EDIT: Drawables - это не все актеры, некоторые - спрайты (игровые объекты), примитивные фигуры и т.д. На самом деле единственной причиной, по которой мне нужен getPosition() в цикле рисования, является то, что для того, чтобы подделать глубину, я петлю через вектор перейдите от координаты 0 Y к нижней части экрана, объекты, расположенные выше на экране, сначала нарисованы, а затем позади объектов ближе к "фронту". Я не писал классы Drawable/Transformable, и я предпочел бы не полностью их изменять, чтобы удовлетворить один вызов функции в одном экземпляре. Единственный момент, когда это проблема, - это когда я ссылаюсь на вектор Drawables. Мне не совсем понятно, почему это было спроектировано так, как это было, потому что все, что использует класс drawable, также наследует трансформируемый класс, поэтому они должны быть едины, но они не являются.

Мой вопрос заключается в следующем:

class foo {}
class bar{}
class foobar : public foo, public bar {}

такая же, как и эта

class foo {}
class bar : public foo {}
class foobar : public bar {}

Может ли объект наследовать общедоступные и защищенные члены класса, который их родитель наследует?

  • 0
    Вы немного переусердствовали при попытке сопоставить свойства с типами. Почему не вектор актеров? Как вы обнаружили, знание того, что что-то «можно нарисовать», - это не то же самое, что знание «как нарисовать это». На самом деле, в этом случае я бы сказал, что у чего-то должно быть положение, даже если оно не трансформируется.
  • 3
    почему бы не показать код?
Показать ещё 2 комментария
Теги:
inheritance

2 ответа

0
Лучший ответ

В этом случае дизайн, который я бы выбрал, - это удаление класса Transformable и перенос позиционных атрибутов и функций-членов в класс Drawable. Что-то, что нужно "вытащить", нужно где-то нарисовать и, следовательно, требует положения, независимо от того, может оно двигаться или нет.

Может ли объект наследовать общедоступные и защищенные члены класса, который их родитель наследует?

Короткий и сладкий: Да. (Только если наследование является public или protected)

Смотрите это для получения дополнительной информации о типах наследования.

  • 0
    Именно то, что мне нужно было знать, спасибо!
  • 0
    Также рекомендуем взглянуть на этот ответ тоже.
0

Подумайте, будет ли когда-либо преобразован объект, который не является пригодным для рисования. Зачем перемещать то, что никогда не увидишь.

Кроме того, не следует ли getPosition (и предположительно setPosition) на самом деле быть частью чего-то, что можно сделать? Откуда вы знаете, где рисовать иначе.

Я настоятельно рекомендую тщательно пересмотреть структуру вашего класса, объединить функциональность, которая является общей, не имеет миллионов лишних интерфейсов, потому что вы можете.

  • 0
    Я согласен, но я изменяю библиотеку с открытым исходным кодом, чтобы работать с тем, что я хочу сделать, изменение всей структуры библиотеки на данном этапе было бы гораздо большим, чем я хочу взять на себя. Функция draw на самом деле является виртуальной функцией drawable, она реализована в другом классе Drawables RenderTarget, который использует указатель на вершины объекта и количество вершин в массиве для рисования примитивов для конкретного состояния визуализации. Это запутанно, но это работает, и я не написал это, поэтому я предпочел бы не менять его.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню