2013-10-28 44 views
0

今天我看到了一個對我來說看起來非常可怕的剪輯,但是不幸的是我不能簡單地改變它,所以我想知道我是否可以繞過這個方式。我有一個帶有構造函數的類,它具有成功的輸出參數。但是這對我來說真的很難看。現在,如果我想要或不需要,從這個課程中派生出來,我必須把這個參數與我一起拿走。帶輸出參數的構造函數

class ClassA { 
    ClassA(out bool success) {...} 
} 

class B: ClassA { 
    // call the constructor from ClassA but without the out-param 
} 

所以我倒是知道,如果它的好做法,或者如果不是我怎麼可以避免聲明從ClassB的的出PARAM。

+0

不,你不能繞過它。 – GrantByrne

+1

這真是糟糕的編程習慣。請拍*寫這個的人(請注意,如果在你的國家這是合法的,你可能只會開槍,否則,把他踢出去)。 – Steven

+0

我很高興我不是唯一感覺如此的人......謝謝史蒂文:D – HimBromBeere

回答

1

哦,那類的設計反正壞了,所以讓我們打破它多一點(注意我不推薦這種方式!):

void Main() 
{ 

} 

public class ClassA 
{ 
    public ClassA(out bool success) 
    { 
     success = true; 
    } 
} 

public class B: ClassA 
{ 
    private static bool success; 

    // call the constructor from ClassA but without the out-param 
    public B() 
     : base(out success) 
    { 
    } 
} 

除此之外,最接近你可以得到正在一個工廠方法:

public class B : ClassA 
{ 
    public static B Create() 
    { 
     bool success; 
     var result = new B(out success); 
     if (success) 
      return result; 
     // TODO: Dispose result? 
     throw new StupidProgrammerException(); 
    } 
} 
+1

從我的角度來看,工廠方法將是最佳實踐,好主意 – HimBromBeere

3

你可以做這樣的事情:

class ClassA 
{ 
    protected ClassA(out bool success) 
    { 
     success = true; 
    } 
} 

class B : ClassA 
{ 
    [ThreadStatic] 
    static bool success; // static to use in base(out success) call 

    public bool Success 
    { 
     get; 
     private set; 
    } 

    public B() 
     : base(out success) 
    { 
     Success = success; 
     success = false; // reset value 
    } 
} 

這很醜陋,但至少你可以擺脫out參數,如果你願意的話。

+0

你甚至不需要[ThreadStatic]。由於'success'永遠不會被使用,所以當你移除[ThreadStatic]時,沒有機會引入任何併發錯誤。你不必重置它。 – Steven

+0

或者,當'success'爲false時(但在這種情況下,您確實需要[ThreadStatic])時,請考慮拋出異常。 – Steven

+0

@Steven很好的基類init'成功',我將它存儲在屬性中,以防萬一。我想過拋出異常,但不確定。 –

2

雖然將refout參數傳遞給構造函數是醜陋的,但有些類型嘗試創建可用實例會產生副作用,並且可能會在某些副作用發生後失敗。如果無法構造一個有效的對象,則構造函數通過其將信息傳遞給調用者的唯一方法是將其存儲在threadstatic字段中,將其封裝在拋出的異常中,將其存儲或饋送給傳入的對象或委託,或將其寫入ref/out參數。其中,只有參數ref/out明顯表明客戶端代碼應該做些什麼的信息的存在。

refout參數的存在常常是指示一個構造應protected,以及外碼應該通過一個工廠的方法,其確保如果一個異常被拋出傳入出對象將得到適當地使用。但是,爲了合理支持繼承,它必須提供至少一個在其外部可見的構造函數。讓這個構造函數使用outref參數可能是讓一個調用者知道如果構建失敗需要清理什麼的類的最不可靠的方法。