2013-07-30 56 views
0

我有這樣的代碼(它背後的整個故事是在這裏:https://codereview.stackexchange.com/questions/28990/fancy-pants-vs-cowboy-coding):如何從工廠返回「無」作爲默認情況?

public class BeltPrinterFactory : IBeltPrinterFactory 
{ 
    public IBeltPrinter NewBeltPrinter() 
    { 
     switch (printerChoice) 
     { 
      case BeltPrinterType.ZebraQL220: 
       return new ZebraQL220Printer(); 
      case BeltPrinterType.ONiel: 
       return new ONielPrinter(); 
      default: 
       return new ZebraQL220Printer(); 
     } 
    } 
} 

...但增加了一個「無」的枚舉,因爲許多客戶不會有/使用一個:

public enum BeltPrinterType 
{ 
    None, 
    ZebraQL220, 
    ONiel 
    // add more as needed 
} 

編譯器不會讓我沒有默認情況(「不是所有的代碼路徑都返回一個值」)。

「無」選項也許應該是默認情況,但是如果None是printerChoice的當前值,則永遠不應該調用工廠(當「無」時開始滾動滾動的GUI不會顯示,是值),但爲了編譯器的緣故,這應該如何實現?我能以某種方式回報什麼嗎?或將我需要做些什麼「怪異」,如:

. . . 
    default: 
     return new None(); 
    . . . 

public class None : IBeltPrinter 
{ 
    public void PrintLabel(string price, string description, string barcode) 
    { 
     ;// do nothing 
    } 
} 
+2

它不是_weird_,它被稱爲[空對象模式](http://en.wikipedia.org/wiki/Null_Object_pattern),IMO比處理異常或空值要好得多。 –

+0

工廠模式已經(在大多數情況下)已經過時並被IoC和依賴注入替代。 –

+5

@HighCore,它有?我一定錯過了備忘錄。 –

回答

4

如果None不允許工廠選項,則拋出異常。
如果None對工廠有效,則返回虛擬執行IBeltPrinter
不要返回null

3

在這種方法的最終拋出一個NotSupportedException,不返回null

1

我要去刺這個。

這可以幫你嗎?

public class BeltPrinterFactory : IBeltPrinterFactory 
{ 
    public IBeltPrinter NewBeltPrinter() 
    { 
    BeltPrinter item = new BeltPrinter(); 
    switch (printerChoice) 
    { 
     case BeltPrinterType.ZebraQL220: 
     item.FunctionCall = ZebraCallback; 
     case BeltPrinterType.ONiel: 
     item.FunctionCall = ONielCallback; 
     default: 
     // do nothing; 
    } 
    return item; 
    } 
} 

你需要創建回調和重新設計你的IBeltPrinter,但布隆伯格市長和O.J.辛普森應該能夠理解它。

要麼,要麼我不明白你在問什麼。