我正在尝试编写 DRY 代码,并且我有以下设置,Visual Studio 的代码分析系统告诉我这是不明智的:
public abstract class ShaderBase
{
protected ShaderBase(Device device, string vertexShaderString, string pixelShaderString)
{
ShaderSignature inputSignature;
using (ShaderBytecode bytecode = ShaderBytecode.CompileFromFile(vertexShaderString, "VShader", "vs_4_0", ShaderFlags.None, EffectFlags.None))
{
vertexShader = new VertexShader(device, bytecode);
inputSignature = ShaderSignature.GetInputSignature(bytecode);
}
inputLayout = MakeInputLayout(device,inputSignature);
}
protected abstract InputLayout MakeInputLayout(Device device, ShaderSignature inputSignature);
}
public class TextureShader:ShaderBase
{
public ColourShader(Device device) : base(device,"shaders/colour.fx", "shaders/colour.fx")
{
}
protected override InputLayout MakeInputLayout(Device device, SlimDX.D3DCompiler.ShaderSignature inputSignature)
{
return new InputLayout(device, inputSignature, new[] {
new InputElement("POSITION", 0, SlimDX.DXGI.Format.R32G32B32_Float, 0),
new InputElement("COLOR",0,SlimDX.DXGI.Format.R32G32B32_Float,0)
});
}
}
如您所见,我有一个基类,从中我有多个派生类。每个派生类使用不同的 InputLayout,因此必须使用 MakeInputLayout 的不同实现,这就是我重写它的原因。但是,每个派生类都必须执行我放在基类构造函数中的代码,包括对派生类拥有的 MakeInputLayout 的任何实现的调用。
我试图尽可能避免代码重复,但微软建议我永远不应该在基类构造函数中调用可覆盖函数,即使覆盖的实现都不依赖于运行时设置的值(从技术上讲,它们可以标记为静态,如果 c# 允许我们覆盖静态)。
我想知道的是,让基类强制派生类在其构造函数中调用自己的函数派生实现的可接受方式是什么?还是我只需要复制和粘贴一些代码并降低系统的可维护性?