1。以下のように、一般的な練習を配布インターフェースを作成し、各注文を実現するためには、次のとおりです。
パブリック インターフェース IDistribute <T> { ボイド(T tの)配布。 } パブリック クラス OrderDistribute:IDistribute <オーダー> { 公共 ボイド(Oreder順序)を配布 { // 配送订单 } } パブリック クラスDistributeHelperは { IDistribute <オーダー> =配布)(DistributeFactory.Createします。 公共 のボイドDistributeOrder(受注オーダー) { distribute.Distribute(オーダー)。 } }
配信方法は、OrderDistributeが指定された論理、抽象すべてのアプリケーションを実行するため、このインタフェースを実装IDistribute抽象インタフェース、すなわちIDistribute部分を依存しています。
2。さて、理由の変化に対する需要、VIP配布機能を必要とするため、我々はインターフェイスでVIP注文方法の一般的な方法を増加します。
パブリック インターフェース IDistribute <T> { ボイド(T tの)配布。 ボイドDistributeVIP(T tの); } パブリック クラス OrderDistribute:IDistributeは<受注> { 公共 ボイドが配布(Oreder順序) { // 配送订单 } 公共 ボイドDIstributeVIP(注文vipOrder) { // 配送VIP订单 } } パブリック クラスDistributeHelper { IDistribute <オーダー>配布= DistributeFactory。作成します(); 公共 のボイドDistributeOrder(受注オーダー) { distribute.Distribute(オーダー)。 } 公共 ボイドDistributeVIPOrder(注文ordervip) { distribute.DistributeVIP(ordervip)。 } }
このシナリオは比較的正常で、誰もがインタフェースを変更するどのような数年を予測しなかっただろう、インタフェースは変更はすべてのインターフェイスに依存している時に行われなければならないまた、インタフェースは、汚染を表示します変更する必要がある、など、問題の範囲につながります統合なので、上のテストと。
3。C#の拡張メソッドは、独立した進化を可能に使用することで、ロジックを実装します。
パブリック インターフェース IDistribute <T> { 無効配布(T T)を; // インターフェイスはない } パブリック クラス OrderDistributeを:IDistribute <オーダー> { 公共 ボイドが配布(Orederオーダー)// 初期実装定数 { // 配達注文 } } パブリック 静的 クラスDistributeExtends { 公共の 静的な 無効 DistributeVIP(この IDistribute <注文> 配布、注文vipOrder) { // 配布VIP } } パブリック クラスDistributeHelper { IDistribute <オーダー>配布= DistributeFactory.Create()。 公共 のボイドDistributeOrder(受注オーダー) { distribute.Distribute(オーダー)。 } 公共 ボイドDistributeVIPOrder(注文ordervip) { distribute.DistributeVIP(ordervip)。 } }
拡張メソッドは、インターフェイスを変更するのではなく、別の次元で開発されています。
継承を架橋し、架橋を達成するために拡張メソッドが抽象インタフェース上で、むしろ署名にもはや依存して本質的に異なる拡張メソッドである、天然の適応性がある、缶自由に無制限の拡張。
C#で、好ましくは他のモードに、ブリッジモードに加えて、抽象化および分離のパターンを設計するために使用される拡張方法も大きな利益をもたらすことができます。
引用「.NET Frameworkのモデル」