プライベート構造体をインスタンス化する「アダプタ」基本クラスを作成しています。構造体は、抽象Configure()メソッドを介して継承者に公開されるため、継承者はプロパティを設定できます。次のように実装します。
public abstract class PaymentAdapter {
private PaymentObject p = new PaymentObject();
protected PaymentObject CreditCardPayment {
get { return p; }
}
protected abstract void Configure(PaymentObject payment);
public MyResponse ProcessPayment() {
// Run the adapter's setup
Configure(p);
// Charge the customer
var chargeResult = p.DoSomething();
return new MyResponse {
MyResult = chargeResult
};
}
}
注意深い人は、次の行に注意が必要なものがわかります。
protected abstract void Configure(PaymentObject payment);
具体的なクラスでオーバーライドされると、このメソッドは(ほとんど)コンシューマーに構造体のプロパティを直接変更する機会を与えます。これは望ましい結果です。
私の質問は-ref引数を使用するか、voidをPaymentObjectに変更して、コンシューマーがインスタンスを返すようにする必要がありますか?
方法1:
protected abstract PaymentObject Configure(PaymentObject payment);
方法2:
protected abstract void Configure(ref PaymentObject payment);
したがって、クラスを継承する場合、コンシューマーは次のことを行う必要があります。
方法1:
public class MyConsumer : PaymentAdapter {
#region Overrides of PaymentAdapter
protected override PaymentObject Configure(PaymentObject payment) {
payment.AProperty = "Something";
return payment;
}
#endregion
}
方法2:
public class MyConsumer : PaymentAdapter {
#region Overrides of PaymentAdapter
protected override void Configure(ref PaymentObject payment) {
payment.AProperty = "Something";
}
#endregion
}
構文のわずかな変更は別として、他に何か違いはありますか?これは好みのことですか、それとも一方を他方よりも使用することには見えない利点がありますか?
コードが少し少ないので、メソッドからオブジェクトを排他的に返す長年の経験とは対照的に、「ref」メソッドを使用する傾向があります。これは、ref引数の完璧なケースのようです。これにより、コンシューマーの作業が少し簡単になり、オブジェクトをあちこちに設定していないことを意味します。