我希望我的C#引擎能够让用户在使用Direct3D或OpenGL之间进行选择。 我的内部引擎设计为着色器类的抽象示例:
internal class Shader
{
private IShaderImplementation _implementation;
internal Shader(ShaderType type, string code)
{
switch (Engine.GraphicsInterface)
{
case GraphicsInterface.Direct3D:
_implementation = new Direct3DShader(type, code);
break;
case GraphicsInterface.OpenGL:
_implementation = new OpenGLShader(type, code);
break;
default:
throw new UnsupportedInterfaceException("Shader");
break;
}
}
internal void Compile()
{
_implementation.Compile();
}
}
我认为这是一个很好的设计模式。 (我也更喜欢在工厂方法中调用构造函数,你可能已经注意到了,但这只是一个副作用。)
然而:
以更通用的形式询问,我的主程序集接口和类如何在子程序集中实现和扩展?
PS:我听说过我知道一两分钟的反思,然后是托管可扩展性框架,但我还没弄清楚它是如何融入我的设计的。答案 0 :(得分:1)
将其设计为图形和声音层的3个类库。
类库1:界面层
类库2(OpenTK):
类库3(SharpDX):
游戏代码
AppDomain.Load
加载类库2或3。加载硬件程序集并拥有Assembly
对象后,使用反射来获取对接口的引用,可能是这样的:
// Making up this pseudo code
GameApi gameApi = (GameApi)hardwareAsm.GetType(GameApi).GetMethod("Initialize").Invoke();
TheGame gameWorld = gameApi.CreateGame(...);
gameWorld.ResolutionChanged += Resolution_Changed(...);
gameWorld.Terminated += Terminated(...);
gameWorld.KeyDown += Key_Down(...);
// etc....
gameWorld.Start();
让整个图层在自己的应用程序域中运行的好处很多: