あなたがインターフェイスメンバを宣言するときにC#8.0 .NETのコア3.0以降では、リアライズを定義することができます。 最も一般的な解決策は、安全にメンバーを追加することで、多数のクライアントが使用するインタフェースを公開されています。
このチュートリアルでは、学びます。
- 安全に拡張インターフェイスを達成するために、Addメソッドを使用します。
- より高い柔軟性を提供するために、達成することがパラメータ化を作成します。
- だから、代替として、より具体的な実装を提供することができます実現。
コンピュータは、C#8.0コンパイラのプレビューを含め、.NETのコアを実行するように設定する必要があります。 以下から のVisual Studio 2019 または最新 の.NETのコア3.0プレビューSDK を開始するには、C#8.0コンパイラのプレビューを使用することができます。 .NETコアから3.0プレビュー4人のメンバーは、デフォルトのインターフェイスを提供し始めました。
パブリック インターフェイスICustomer { IEnumerableを <IORDER> PreviousOrders { 取得します。} 日時DateJoined { 得ます。} のDateTime?LastOrder { 取得します。} 列名{ 得ます。} IDictionaryを <日時、文字列 >アラーム{ 得ます。} }
彼らは、第2のインターフェースの明示的順序を定義します。
パブリック インターフェイスIORDER { DateTimeのは、購入した{ 取得; } 小数点コスト{ 得ます。} }
これらのインタフェースを通じて、チームは、顧客のためのより良い経験を作成するために、そのユーザーのためのライブラリを生成することができます。 彼らの目標は、既存の顧客とのより深い関係を構築し、新規顧客との関係を改善することです。
さて、それはライブラリの次のバージョンにアップグレードする時が来ました。 要求された機能の一つは、大量注文を顧客のための忠実な顧客の割引を提供することができます。 関係なく時に顧客の注文の、この新しい忠実な顧客の割引に適用されます。 割引は各顧客の財産に固有のものです。 各実装は異なるルールを設定ICustomer忠実な顧客の値引きと考えることができます。
最も自然な方法を、この機能を追加することで強化忠実な顧客に何らかの割引を適用するための方法を使用することで ICustomer
インタフェースを。 設計案は、経験豊富な開発者の注目を集めている:「!一度発表され、インターフェイスが固定されている !これは画期的な変化である」C #8.0を追加し、デフォルトのインターフェイス のインターフェイスをアップグレードするために使用します。 ライブラリの作者は、インタフェースに新しいメンバーを追加し、これらのメンバーのデフォルトの実装を提供することができます。
まだ任意の実装に代替を実装を可能にしながら、デフォルトのインターフェイスは、インターフェイスをアップグレードするために、開発者を可能にします。 ユーザーは、非破壊的変化として実装され、デフォルトのライブラリーを受け入れることができます。 彼らのビジネスルールが異なる場合は、それが置換することができます。
顧客忠実な顧客割引のために:契約の実装をデフォルトする可能性が最も高いチーム。
注文のボリュームとラインと割引率の割引に必要な条件で:アップグレード機能の2つのプロパティを設定するために提供されるべきです。 これは、デフォルトのインターフェイスメンバーのための完璧なソリューションです。 あなたはICustomerインターフェイスメソッドに追加して、実現する可能性が最も高いことができます。 すべての既存および新規の実装では、デフォルトの実装を使用するか、または独自の実装を提供することができます。
まず、実装に新しいメソッドを追加します。
// バージョン1: 公共 小数ComputeLoyaltyDiscount() { 日時TwoYearsAgo = DateTime.Now.AddYears( - 2 )。 もし((DateJoined <TwoYearsAgo)&&(PreviousOrders.Count()> 10 )) { 戻り 0.10メートル。 } 戻り 0 。 }
ライブラリの作者は、実装を確認するために使用される最初のテストを書きました:
SampleCustomerのC = 新しい SampleCustomer(" 顧客1 "、新たな日時(2010、5、31 )) { アラーム = { { 新規のDateTime(2010、08、12)、" チャイルズの誕生日" }、 { 新しい日時(1012、11、15)" 記念日" } } }。
SampleOrder O = 新しい SampleOrder(新規のDateTime(2012、6、1 )、5M)。 c.AddOrder(O) O = 新しい SampleOrder(新規のDateTime(2103、7、4 )、25メートル)。 c.AddOrder(O) // 检查折扣 ICustomer theCustomer = C; Console.WriteLineを($ " 現在割引:{theCustomer.ComputeLoyaltyDiscount()} ");
次のテストの点に注意してください。
// 检查折扣 ICustomer theCustomer = C; Console.WriteLineを($ " 現在割引:{ theCustomer.ComputeLoyaltyDiscount() } ");
キャストことが必要です。 クラスはする必要はありません 実装を提供する。これは、によって行われ インタフェースを提供します。 しかし、 クラスは、そのメンバーの中からインターフェイスを継承しません。 ルールは変更されていません。 インターフェイス及びインプリメンテーションで宣言された方法のいずれかを呼び出すために、変数の型は、この例のように、型インタフェースでなければなりません 。SampleCustomer
ICustomer
SampleCustomer
ComputeLoyaltyDiscount
ICustomer
SampleCustomer
ICustomer
// バージョン2: パブリック 静的 ボイドSetLoyaltyThresholds(前のTimeSpan、INT minimumOrders = 10 、小数 percentageDiscount = 0.10メートル) { 長さ = 前。 orderCount = minimumOrders。 discountPercent = percentageDiscount。 }
プライベート 静的のTimeSpan長= 新規のTimeSpan(365 * 2、0、0、0); // 2年 プライベート 静的 int型 orderCount = 10 ; プライベート 静的 小数点 discountPercent = 0.10メートル。 公共 小数ComputeLoyaltyDiscount() { 日時開始 = DateTime.Now -長さ。 もし((DateJoined <開始)&&(PreviousOrders.Count()> orderCount)) { 戻りdiscountPercentと、 } 戻り 0 。 }
この小さなコードフラグメントは、多くの新しい言語機能を示しています。 インターフェイスは、今フィールドやメソッドなどの静的メンバを含めることができます。 また、異なるアクセス修飾子を有効にします。 他のフィールドは特別で、新しいメソッドはpublicです。 インターフェイスは、メンバーが任意の修飾子を使用することができます。
忠実な顧客割引は、従来の式を用いて算出されるが、アプリケーションの異なるパラメータは、カスタム実装を提供する必要はありません。彼らは、静的メソッドの引数を介して設定することができます。 たとえば、次のコードは、どの顧客が一ヶ月以上のメンバーになるために数々の賞に「顧客の感謝」を設定します。
ICustomer.SetLoyaltyThresholds(新規のTimeSpan(30、0、0、0)、1、0.25メートル)。 Console.WriteLineを($ " 現在割引:{ theCustomer.ComputeLoyaltyDiscount() } ");
現在、ユーザーがプログラムの類似プロジェクトのデフォルトの実装が必要になる場合があり、または無関係なルールのセットを提供するために、便利な実装を提供するためのコードを追加しました。 最後の機能のために、私たちはプログラムのデフォルトの実装に基づいて生成する必要があるかもしれないユーザーを達成するために少しリファクタリングコードを見てみましょう。
顧客が新しいスタートアップを誘致したいとします。 彼らは、新規顧客のための最初の注文の50%の割引を提供する、 しかし、既存の顧客には、標準的な割引を取得します。 ライブラリの作者は、デフォルトの実装に移動する必要があり、その実装にコードを再利用することができます任意のクラスのこのインタフェースを実現するためのメソッド。 インターフェイスメンバーの既定の実装は、この共有メソッドを呼び出します。 protected static
公共 小数 ComputeLoyaltyDiscount()=> DefaultLoyaltyDiscount(この); 保護された 静的 小数DefaultLoyaltyDiscount(ICustomer c)は { 日時開始 = DateTime.Now -長さ。 もし((c.DateJoined <開始)&&(c.PreviousOrders.Count()> orderCount)) { 戻りdiscountPercentと、 } 戻り 0 。 }
このインタフェースを実装するクラスの実現において、置換は、静的なヘルパーメソッドを呼び出して、「新規顧客」の割引を提供するためのロジックを拡張することができます。
公共 小数ComputeLoyaltyDiscount() { 場合(PreviousOrders.Any()== 偽) リターン 0.50メートル。 他の リターン ICustomer.DefaultLoyaltyDiscount(この); }
我々は、(可能な全完全なコードを表示するために、[GitHubの上の例リポジトリ]に配置することができる GitHubの上の例リポジトリにアクセスするアプリケーションを取得します)。
これらの新機能は、これらの新しいメンバーが妥当なデフォルトの実装を持っている場合、インタフェースは安全に更新できることを意味します。 インターフェースは、複数のクラスに実装することができる単一機能の概念を発現するように設計されています。 その結果、ときに、同じコンセプトのために必要な新しい機能の発見は、インタフェース定義をアップグレードするより簡単にすることができます。