Хочу я сделать такую штуку. Объясню на примере.
Есть, допустим, несколько физических движков, которые поддерживают разные наборы фич. Какие-то, допустим, умеют прикладывать силы, какие-то вращать объекты, какие-то трение. Хочется сделать так, чтобы движки можно было менять хоть налету, но при этом проверка совместимости по фичам была на этапе компиляции.
Как я это вижу:
Есть множество интерфейсов:
IApplyForce { virtual void ApplyForce(int nobj, vector force) = 0; }
IRotateObject { virtual void RotateObject(int nobj, float angle) = 0; }
ISetFriction { virtual void SetFriction(float amount) = 0; }
Движки реализуют его подмножества:
Engine1: public IApplyForce, public IRotateObject, public ISetFriction {}
Engine2: public IApplyForce, public IRotateObject {}
Engine3: public IApplyForce, public ISetFriction {}
Нужна возможность сделать что-то типа указателя на несколько интерфейсов сразу, к которому можно кастануть только классы, реализующие все эти интерфейсы.
// Допустим, пользователю не нужно трение вообще
SmartEnginePointer<IApplyForce, IRotateObject> engine = new Engine1;
// Так можно сделать, Engine2 реализует нужные интерфейсы
engine = new Engine2;
// Тут ошибка компиляции, ибо IRotateObject не реализован
engine = new Engine3;
Есть идеи как это реализовать?