C#访问修饰符取决于状态

时间:2010-01-15 02:08:33

标签: c# properties

假设使用信用卡类作为属性的订单(聚合类)。根据订单状态,我想更改信用卡类属性的访问修饰符。例如:如果Order state = Order.NewOrder,则允许信用卡属性可修改,但是如果Order state = Order.CompletedOrder,我不想允许信用卡中的属性可设置。

我希望能够在编译时检查运行时间。

我想到的唯一解决方案是创建从同一父类继承的2个类;一个允许属性可以被设置而另一个不能被设置,但是如果有一个状态需要一些属性可以设置而其他属性不可设置,那么它会变得非常快。

非常感谢任何想法。

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“为另一个对象提供代理或占位符,以控制对它的访问。”您将对象的保护代理版本放在实际对象的位置,保护代理中的访问逻辑返回只读数据,但检查何时尝试写入。