Когда можно изменить состояние объекта (например, инициализацию) при доступе к получателю свойства? - PullRequest
1 голос
/ 19 ноября 2009

(кроме настройки прокси!)

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

При написании вопроса я пришел к выводу, что лучше было бы инициализировать конструкцию наследника. Это потребовало бы, чтобы каждый наследующий класс вызывал метод инициализации родителей, но я думаю, что это лучше, потому что:

  1. Мне не нужно помнить, чтобы инициализировать в базовом классе на каждом новом свойстве getter / setter.
  2. Я случайно не запускаю инициализацию во время отладки ( см. Мой вопрос здесь )

Если у вас когда-либо был код, который изменяет состояние в получателе свойств, думаете ли вы, что это абсолютно оправдано? Можете привести пример для такого случая? (Или даже описать шаблон?)

Я мог думать только о прокси-доступе, когда вы не хотите выполнять инициализацию до доступа к свойству ...


Кто-то предложил мне инициализировать с помощью фабричного / статического метода - это на самом деле хорошая идея (когда конструкция проста, немного сложнее, когда она не одинакова для наследующих классов), но ответ был удален, прежде чем у меня появилась возможность отправь мой ответ. очень плохо.

1 Ответ

4 голосов
/ 19 ноября 2009

Ленивое кеширование. Где вы не загружаете данные из базы данных, пока не получите доступ к свойству. (Не уверен, что вы имеете в виду прокси-доступ).

Однако я не считаю, что это логически меняет состояние объекта, поскольку поведение класса остается неизменным до и после доступа. Данные неявно там всегда. Логическое состояние остается неизменным.

Я бы никогда не изменил логическое состояние класса через геттер, так как он противоречит интуитивно и логически неверен. Вы рискуете всевозможными непреднамеренными последствиями ..

Вы можете сделать что-то вроде следующего:

    public class baseone
    {
        private baseone ()
        {
        }

        public baseone ( string huh )
        {
                initialise(huh);
        }

            protected abstract initialise(string stuff); 
    }


    public class niceone : baseone
    {
        public niceone (string param)
         : base(param)
        {

        }

            protected override initialise(string stuff)
            {
               // do stuff..
            }
    }

Создание частного конструктора по умолчанию для базового класса гарантирует, что необходимые параметры должны быть переданы для инициализации класса.

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