2016-02-19 3 views
2
public class A 
{ 
    public A() 
    { 
     // DoSomething 
     // If something is not correct return null; 
    } 
} 

public class B : A 
{ 
    public B() :base() 
    { 
     // Check if everything was fine in base class 
    } 
} 

Как проверить здесь, если базовый класс вернулся null или он выполнил свою работу? Тогда, согласно этому, я хочу перестать быть экземпляром?C# условно продолжить в соответствии с поведением базового класса

Спасибо.

+0

Если что-то не работает правильно, есть ошибки, поэтому вы должны использовать утверждения try-catch. –

ответ

1

Конструктор не может потерпеть неудачу, поэтому он не может вернуться null.

Вы можете либо рассмотреть использование try-catch и throw, или сделать флаг в base class, который будет true или false на основе вашей инициализации, как это.

public class A 
{ 
    public bool IsInitializationOk; //by default, this is false 
    public A() 
    { 
     // DoSomething 
     if(something is not correct) 
      return; 
     IsInitializationOk = true; 
    } 
} 

public class B : A 
{ 
    public B() :base() 
    { 
     // Check if everything was fine in base class 
     if (IsInitializationOk){ 
      //Do something. 
     } 
    } 
} 
2

Я предлагаю использовать метод фабрики вместо конструктора:

public class A 
{ 
    protected A() 
    { 
     ... 
    } 

    protected Boolean IsCorrect() {...} 

    public static A Create() { 
     result A = new A(); 

     if (!IsCorrect())  
     return null; 
     else 
     return result; 
    } 
} 

public class B : A 
{ 
    protected B() :base() 
    { 
     ...   
    } 

    public static B Create() { 
     result B = new B(); 

     if (!IsCorrect())  
     return null; 
     else 
     return result; 
    } 
} 

....

B value = B.Create(); // instance of B or null 
0

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

1

Как проверить здесь, если базовый класс возвратил null или он выполнил свою работу?

Конструктор ничего не возвращает. Цель конструктора - привести объект в состояние инициализации таким образом, чтобы он был готов к работе.

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

Если задача DoStuff является критически важной и должна работать для работы этой иерархии объектов, то бросать исключение - это правильный способ справиться с этим, так как вы не можете работать с объектом.

Если DoStuff это «приятно иметь», но не критично для работы с объектом, вы можете просто сохранить защищенный bool сигнализации успех или неудача:

public class A 
{ 
    protected bool wasSuccessfull; 
    public A() 
    { 
     wasSuccessfull = DoStuff(); 
    } 

    public bool DoStuff() => true; 
} 

public class B : A 
{ 
    public B() 
    { 
     if (wasSuccessfull) 
      Console.WriteLine("yay"); 
    } 
} 

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

+0

Если «DoStuff» является только «приятным», он не должен обращаться к конструктору IMO, а к методу, который может или не могут быть вызваны надлежащим образом. – HimBromBeere

+0

Прочтите мой последний абзац, это более или менее то, что я сказал. Я бы сделал это, если бы это было мое решение. Я просто перечисляю возможности здесь, так как я не уверен, что на самом деле «лучше», чем другой. –

+0

Действительно, я не читал его правильно. +1 для многих возможностей. – HimBromBeere