2016-02-19 22 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