Я занимаюсь разработкой 3D-движок, предположим, что у меня есть следующие классы интерфейса:static_cast класс интерфейс для внутренней реализации двигателя
class IA {
public:
virtual ~IA() {}
virtual void doSomething() =0;
};
class IB {
public:
virtual ~IB() {}
virtual void bindA(IA*) =0;
};
Если вы хотите, чтобы ухватить объект типа «IA» или «IB «вы должны получить их с завода, который зависит от используемого API-интерфейса (например, OpenGL). Функция IB :: bindA (IA *) нуждается в доступе к данным из реализации IA и для достижения этого класса static_cast
для класса реализации и последующего доступа к его элементам.
Мне было интересно, что вы думаете об этом конкретном использовании static_cast
, как вы думаете, это плохой дизайн? или вы думаете, что все в порядке?
Двигатель должен обеспечивать тот же интерфейс независимо от того, какой API-интерфейс используется, поэтому я не думаю, что смог бы достичь этого с помощью виртуальных функций, потому что я не могу заранее знать, что нужно IB от IA.
спасибо: D
Редактировать
Дело в том, двигатель имеет следующие два класса:
class IHardwareBuffer {
public:
virtual ~IHardwareBuffer() {}
virtual void allocate(....) =0;
virtual void upload(....) =0;
};
и
class IMesh {
public:
virtual ~IMesh() {}
virtual bindBuffer(IHardwareBuffer*) =0;
...
};
I "может" слить Классы IMesh и IHardwareBuffer вместе, но это не имеет большого смысла, поскольку HardwareBuffer - это просто «тупой» кусок памяти с данными вершин в нем, а Mesh - это один или два HardwareBuffers с другими данными вокруг них, такие как формат вершин, материал и т. д. Наличие в них отдельных классов позволяет клиентскому коду иметь несколько сеток совместно с общим аппаратным буфером и тому подобное.
Как класс реализации относится к IA? Получается ли это от этого? –
Дизайн? Где? Какие альтернативы были рассмотрены? Почему их отвергли? –
@VaughnCato Реализация IA происходит от IA –