如何从工厂返回“无”作为默认情况?

时间:2013-07-30 18:51:23

标签: c# enums factory factory-pattern

我有这段代码(背后的整个故事就在这里: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
    }
}

3 个答案:

答案 0 :(得分:4)

如果工厂不允许None选项,则抛出异常 如果None对工厂有效,则返回IBeltPrinter的虚拟实现 不要返回null

答案 1 :(得分:3)

在此类方法结束时抛出NotSupportedException,请勿返回null

答案 2 :(得分: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.辛普森应该能够理解它。

要不然,或者我真的不明白你在问什么。