Остановить производный класс от инициализации - PullRequest
0 голосов
/ 21 марта 2012

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

class BaseClass
{
    public BaseClass(Object Param)
    {
        // Do checks
    }
}

У меня (конечно) также есть производный класс

class NewClass : BaseClass
{
    public NewClass(Object Param) : base(Param)
    {
        // Code here
    }
}

Теперь я хотел бы иметь ситуацию, подобную следующей

Если проверка в базовом классе не пройдена, тогда я хотел бы код в производном классе (// Код здесь) вообще не исполняется.

Возможно ли это?И если да, то как?

Ответы [ 6 ]

9 голосов
/ 21 марта 2012

Не пишите « досадное исключение ». Производный класс должен иметь способ узнать, будет или нет выбрасывать ctor базового класса. В противном случае автору производного класса будет нелегко предотвратить ошибку.

Правильно сделать следующее: (1) сделать так, чтобы вызывающая сторона производного класса очень легко узнала, будет ли выброшено исключение или нет, и (2) вылетит без всякой жалости, если они поймите неправильно . Сделайте больно передавать плохие данные и легко избежать этой боли, и в конечном итоге вы никогда не вызовете это исключение, потому что ваши производные классы помогут избежать боли.

3 голосов
/ 21 марта 2012

Лучшее, что вы можете сделать, - это чтобы конструктор базового класса выдал исключение.

2 голосов
/ 21 марта 2012

Возможно ли, да, просто сгенерировать исключение.Тогда вы можете быть уверены, что код производного класса не будет вызван.Это хорошая идея?Возможно, но возможно нет.Вызывать исключение в конструкторе считается плохой формой.

Менее средний вариант - иметь защищенное поле / свойство isValid, которое вы задали в конструкторе базового класса.Производный класс может тогда делать только вещи if(isValid).Пока вы знаете, что вы будете хорошо играть с собой, это будет работать.

1 голос
/ 21 марта 2012

В случае неудачной проверки базовый конструктор может выдать исключение.

Вы можете реализовать так называемый шаблон нулевого объекта, в котором имеется внутренний элемент isValid.Вы можете установить его на false на основе вашей проверки в базовом конструкторе и заставить все ваши методы ничего не делать, если isValid имеет значение false.

Лучший способ, который также устраняет необходимость исключения, этоиспользовать фабричный шаблон.Просто делегируйте создание объекта фабричному объекту / методу, который выполняет проверку и либо создает производный объект, либо нет, основываясь на вашей проверке.

0 голосов
/ 21 марта 2012

После проверки кода в базовом классе установите значение свойства в базовом классе. Вы можете получить доступ к этому в дочернем классе и решить, продолжать или нет

class BaseClass
{
    public bool IsValid {set;get;}
    public BaseClass(Object Param)
    {
        // Do checks and set the value of property
         this.IsValid=false; // or true
    }
}

class NewClass : BaseClass
{
    public NewClass(Object Param) : base(Param)
    {
        if(this.IsValid)
        {
          // Code here
        }
    }
}
0 голосов
/ 21 марта 2012

Да, это возможно, просто выбросить исключение. Создание объекта немедленно завершится неудачей, а производный конструктор не запустится.

...