.Net 3.5の新しい拡張機能により、機能をインターフェイスから分割できます。
たとえば、.Net2.0では
public interface IHaveChildren {
string ParentType { get; }
int ParentId { get; }
List<IChild> GetChildren()
}
(3.5で)次のようになります:
public interface IHaveChildren {
string ParentType { get; }
int ParentId { get; }
}
public static class HaveChildrenExtension {
public static List<IChild> GetChildren( this IHaveChildren ) {
//logic to get children by parent type and id
//shared for all classes implementing IHaveChildren
}
}
これは、多くのインターフェイスにとってより優れたメカニズムのように思えます。このコードを共有するための抽象的なベースは不要になり、機能的にはコードは同じように機能します。これにより、コードの保守が容易になり、テストが容易になります。
唯一の欠点は、抽象ベースの実装が仮想である可能性があることですが、それを回避することはできます(インスタンスメソッドは同じ名前の拡張メソッドを非表示にしますか?そうすることでコードが混乱しますか?)
このパターンを定期的に使用しない他の理由はありますか?
明確化:
ええ、私は拡張メソッドの傾向がどこでもそれらで終わることだと思います。ピアレビューをあまり行わずに.Net値型を使用する場合は特に注意が必要です(文字列にあるのは.SplitToDictionary()
-と似て.Split()
いますが、Key-Value区切り文字も使用していると思います)
そこにはベストプラクティスの議論があると思います;-)
(ちなみに、DannySmurf、あなたのPMは怖いですね。)
ここでは、以前はインターフェイスメソッドがあった拡張メソッドの使用について具体的に質問しています。
私は多くのレベルの抽象基本クラスを避けようとしています-これらのモデルを実装するクラスはほとんどすでに基本クラスを持っています。このモデルは、オブジェクト階層をさらに追加するよりも保守性が高く、過度に結合されていない可能性があると思います。
これは、MSがLinqのIEnumerableおよびIQueryableに対して行ったことですか?