我正在创建一个实例化私有结构的“适配器”基类。该结构通过抽象的 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,让消费者自己返回一个实例?
方法一:
protected abstract PaymentObject Configure(PaymentObject payment);
方法二:
protected abstract void Configure(ref PaymentObject payment);
因此,在继承类时,消费者必须执行以下操作:
方法一:
public class MyConsumer : PaymentAdapter {
#region Overrides of PaymentAdapter
protected override PaymentObject Configure(PaymentObject payment) {
payment.AProperty = "Something";
return payment;
}
#endregion
}
方法二:
public class MyConsumer : PaymentAdapter {
#region Overrides of PaymentAdapter
protected override void Configure(ref PaymentObject payment) {
payment.AProperty = "Something";
}
#endregion
}
除了语法上的细微变化之外,还有其他区别吗?这是一种偏好,还是我看不到使用其中一种的好处?
由于代码略少,我倾向于使用“ref”方法,这与我多年来专门从方法返回对象相反。这似乎是 ref 参数的完美案例 - 它使消费者的工作稍微容易一些,并且意味着我不会到处设置对象。