TemplateFilterクラスを継承するすべてのサブクラス間で異なる動作を処理するために、C# で Template Method パターンを実装しようとしています。
public abstract class TemplateFilter : Operand
{
public TemplateFilter(params string[] values) : base(setValues(values))
{}
public string setValues(params string[] values){
return formatResult(values);
}
public abstract string formatResult(params string[] values);
}
サブクラスの 1 つは次のとおりです。
public class Type3UnaryFilter : TemplateFilter
{
public Type3UnaryFilter(string value, string field) : base(new string[] { value, field }) { }
public override string formatResult(params string[] values)
{
//type{value}:field
return "type{"+values[0]+"}:"+values[1];
}
}
最後に、クラスOperand :
public class Operand : IExpressionComponent
{
public string FilterStatement { get; private set; }
public Operand(string filterStatement)
{
this.FilterStatement = filterStatement;
}
public string evaluate()
{
return this.FilterStatement;
}
}
私の問題は、setValues を statc にする必要があるため、TemplateFilterからOperandコンストラクターを呼び出すことができないことです。一方、setValues を static に設定すると、メソッドformatResultをTemplateFilter.setValuesから呼び出すことができず、目的の動作を実装する責任をサブクラスに任せることができません。では、アーキテクチャを変更せずにこのメカニズムを実装するにはどうすればよいでしょうか?