假设使用信用卡类作为属性的订单(聚合类)。根据订单状态,我想更改信用卡类属性的访问修饰符。例如:如果Order state = Order.NewOrder,则允许信用卡属性可修改,但是如果Order state = Order.CompletedOrder,我不想允许信用卡中的属性可设置。
我希望能够在编译时检查运行时间。
我想到的唯一解决方案是创建从同一父类继承的2个类;一个允许属性可以被设置而另一个不能被设置,但是如果有一个状态需要一些属性可以设置而其他属性不可设置,那么它会变得非常快。
非常感谢任何想法。
答案 0 :(得分:3)
我用几个不同的界面代表信用卡对象。一个人会有二传手和另一个人。 Order类上的CreditCard属性只是getter接口。
class CreditCardBase : ICreditCard
{
string Name { get; }
}
interface IWritableCreditCard : ICreditCard
{
string Name { get; set; }
}
class WritableCreditCard : CreditCardBase, IWritableCreditCard {}
class Order
{
private ICreditCard _card = new WritableCreditCard(); //initially...
public ICreditCard Card { get {return _card; } }
void OnComplete(...) { _card = new CreditCardBase(copy from _card); }
}
在运行时将“卡”属性转换为setter界面以修改卡的属性。如果订单状态现在处于只读状态,那么实现CreditCard的对象将与仅实现getter的实现交换出来。
我看不出你在编译时如何区分,但至少正常的操作是安全的“仅限getter”调用,修改代码将是a)丑陋且易于检测b)将返回如果在错误的时间执行,则为null或throw。
答案 1 :(得分:2)
解决此问题的另一种方法是将“设计模式”pg.208-209作为保护代理。
Proxy pattern“为另一个对象提供代理或占位符,以控制对它的访问。”您将对象的保护代理版本放在实际对象的位置,保护代理中的访问逻辑返回只读数据,但检查何时尝试写入。