関数パラメータを使うことで、コンポーネント間の結合度を下げることができる。この方法には、実装上のトレードオフもあるが、クラスの継承やインターフェイスの実装よりも自由度の高い拡張ポイントを設けたい場合には有用である。
関数パラメータを使って実際の処理を委譲するコードは以下のようになる。
public static IEnumerable<T> CreateSequence<T>(
int numberOfElements,
Func<T> generator)
{
for (var i = 0; i < numberOfElements; i++)
yield return generator();
}
利用側のコードは以下のようになる。
public static void Main()
{
var startAt = 0;
const int nextValue = 5;
var sequence = CreateSequence(1000, () => startAt += nextValue);
sequence.ToList().ForEach(WriteLine);
}
あなたのコードの挙動の一部を利用者が拡張できるようにしたい場合、第一の候補となるのはインターフェイスである。
抽象クラスの定義は、デフォルト実装の提供等の利点があるが、クラス階層を強制するという欠点もある。
関数パラメータは、最も柔軟だが、エラーチェック等の手間がかかる。