Модификатор доступа C # в зависимости от состояния - PullRequest
1 голос
/ 15 января 2010

Принимая Заказ (Совокупный класс) с классом Кредитной карты в качестве свойства. В зависимости от состояния заказа я хочу изменить модификатор доступа в свойствах класса «Кредитная карта». Например: если состояние заказа = Order.NewOrder, то разрешить изменение свойств кредитной карты, однако, если состояние заказа = Order.CompletedOrder, я не хочу, чтобы свойства в кредитной карте можно было устанавливать.

Я хочу иметь возможность проверить во время компиляции и во время выполнения.

Единственное решение, о котором я подумал, было создание 2 классов, наследуемых от одного родительского класса; один, который позволяет настраивать свойства, другой нет, но он очень быстро становится волосатым, если есть состояние, требующее установки одних свойств, а других - нет.

Любые идеи приветствуются.

Ответы [ 2 ]

3 голосов
/ 15 января 2010

Я бы представлял объект кредитной карты с парой разных интерфейсов. У одного были бы сеттеры, а у другого - сеттеры. Свойство CreditCard класса Order будет только интерфейсом получения.

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); }
}

Во время выполнения приведите свойство «Card» к интерфейсу установщика, чтобы изменить свойства карты. Если состояние заказа теперь находится в состоянии только для чтения, то объект, реализующий CreditCard, был бы заменен реализацией, которая реализует только получатели.

Я не понимаю, как вы могли бы различить во время компиляции, но, по крайней мере, обычные действия были бы безопасными вызовами "только для получателя", и код модификации был бы а) уродлив и прост в обнаружении и б) возвратился null или throw, если выполнено в неправильное время.

2 голосов
/ 15 января 2010

Еще один способ решить эту проблему - использовать Design Patterns 'на стр. 208-209 в качестве Protection Proxy .

Шаблон Proxy «предоставляет суррогат или заполнитель для другого объекта для контроля доступа к нему». Вы помещаете версию объекта прокси-сервера защиты вместо фактического объекта, а логика доступа в прокси-сервере защиты возвращает данные только для чтения, но проверяет, когда попытка записи выполняется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...