私は 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# で statics をオーバーライドできる場合は、static というラベルが付けられています)。
私が知りたいのは、基本クラスが派生クラスにコンストラクターで関数の独自の派生実装を呼び出すように強制する許容可能な方法は何ですか? それとも、いくつかのコードをコピー アンド ペーストして、システムの保守性を低下させなければならないのでしょうか?