我有这段代码(背后的整个故事就在这里: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
}
}
答案 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.辛普森应该能够理解它。
要不然,或者我真的不明白你在问什么。