我正在做一個「適配器」基類,它實例化一個私有結構。該結構通過一個抽象的Configure()方法暴露給繼承者,所以他們可以在其上設置屬性。執行標準如下:使用ref返回
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」方法,這與我從方法中專門返回對象的所有年份相反。這對於參考論證來說似乎是一個完美的例子 - 它使消費者的工作稍微容易一些,並且意味着我不會在整個地方設置對象。
在方法2中,您不需要'ref'參數; 'PaymentObject'是一個類,不是一個結構(我假設),因此已經是一個引用類型。 – antonijn 2013-02-20 12:54:45
好吧,讓我們說PaymentObject是一個結構然後:) – Spikeh 2013-02-20 12:57:29
我建議你使用返回方法。沒有實際的需要使用ref,你沒有幾個你想返回的對象。我不會在乎或多或少的2或3行代碼。 – 2013-02-20 12:57:56