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
}

编译器不允许我没有默认情况(“并非所有代码路径都返回值”)。

“无”选项可能应该是默认情况,但如果“无”是打印机选择的当前值,则永远不应该调用工厂(当“无”是值时,启动滚球的 GUI 甚至不会显示) ,但是为了编译器的缘故,这应该如何实现呢?我能以某种方式返回任何东西吗?或者我需要做一些“奇怪”的事情,比如:

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

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

3 回答 3

4

如果None工厂不允许选项,则抛出异常。
如果None对工厂有效,则返回IBeltPrinter.
不要返回null

于 2013-07-30T19:01:44.757 回答
3

在此类方法的末尾抛出 a NotSupportedException,不要返回null

于 2013-07-30T18:53:14.067 回答
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.Bloomberg 市长和 OJ Simpson 应该能够理解它。

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

于 2013-07-31T17:11:42.887 回答