Разрешено ли это изменение в конструкторе? - PullRequest
1 голос
/ 18 сентября 2010

Я хочу иметь перегруженный конструктор, в котором я изменяю значение базового класса в зависимости от того, установлен ли isFirstPost. Если это первый пост, я хочу, чтобы rowkey = 000000. Если это не первый пост, сделайте его цифрой.

Не думаю, что это проблема Azure ... но я больше интересуюсь языком C # и влиянием условного параметра на настройку базового класса. Я не уверен, как это сделать.

public class ForumPost : TableServiceEntity
    {
        public ForumPost(string partitionKey, string rowKey): base(partitionKey, rowKey)
        {
        }
        public ForumPost(ForumThread ParentThread, bool IsFirstPost)
        {
            if (IsFirstPost)
            {
                //call constuctor with special values for base class
                //set baseclass rowkey = 0000000
            }

            else {
             //set baseclass rowkey = 1111111111
              }
         }
}

Ответы [ 2 ]

5 голосов
/ 18 сентября 2010

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

public class ForumPost : TableServiceEntity
{
    public ForumPost(ForumThread ParentThread, bool IsFirstPost)
        : base(ParentThread, GetID(IsFirstPost))
    {
    }

    static string GetID(bool IsFirstPost)
    {
        return IsFirstPost ? "00000" : "11111";
    }
}
2 голосов
/ 18 сентября 2010

Просто сделайте это:

public class ForumPost : TableServiceEntity {
  public ForumPost(ForumThread ParentThread, bool IsFirstPost) 
    : base("partitionkey", IsFirstPost ? "0000000" : "1111111") {
  }
}

Примечание: я не знаю, что вы хотите передать как ключ раздела .

ОБНОВЛЕНИЕ: чтобы понять, на что способна эта конструкция, мы можем взглянуть на C # спецификацию .

В грамматике C # мы находим следующие записи:

конструктор-инициализатор:: base (список аргументов opt ): this (список аргументов opt )Аргумент-лист:аргументсписок аргументов, аргументаргумент:выражениессылка на переменнуюиз ссылки на переменную

Это, в свою очередь, распространяется на все виды выражений, которые поддерживает язык (см. Раздел C.2.4 ).Это включает вызовы методов, математические выражения, троичный условный оператор и многие другие.

В разделе 10.11.1 (Инициализаторы конструктора) спецификации мы находим следующее:

область видимости параметров, задаваемых списком формальных параметров объявления конструктора экземпляра, включает инициализатор конструктора этого объявления.Таким образом, инициализатору конструктора разрешен доступ к параметрам конструктора.[...] Инициализатор конструктора экземпляра не может получить доступ к создаваемому экземпляру.Следовательно, это ошибка времени компиляции, чтобы ссылаться на это в выражении аргумента инициализатора конструктора, так же как и ошибка времени компиляции для выражения аргумента, чтобы ссылаться на любой элемент экземпляра через простое имя.

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

Я думаю, что ответ, который я дал (с условным оператором), является наиболее прямым для вашего примера.Мы также можем перейти к другой крайности и использовать метод фабрики, чтобы получить стратегию для этой логики:

public class ForumPost : TableServiceEntity {
  public ForumPost(ForumThread ParentThread, bool IsFirstPost) 
    : base("partitionkey", 
        RowKeyStrategyFactory.Create().ResolveRowKey(IsFirstPost)) {
  }
}

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

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

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