2016-02-19 23 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-catchthrow,或使得在base class一个标志,该标志将根据您的初始化truefalse,像这样的。

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