考虑以下代码:
switch(formatindex)
{
case 0:
var myExporter = new PngExporter { Background = OxyColors.Black };
fileExtension = ".jpg";
case 1:
var myExporter = new SvgExporter();
fileExtension = ".svg";
}
这当然不会编译,因为我两次声明了myExporter
。
问题是,是否有一种巧妙的方法可以根据转换案例的结果来选择类型/构造函数。
在我的情况下(这引起了这个问题),无论选择哪种类型,使用myExporter
的其余代码都是相同的,因为只有所使用的属性是width和height,并且它们的行为都相同两种类型的出口商的方式。
我不想编写两次后续代码,这就是为什么我认为我可以做与所示代码相似的事情的原因。
答案 0 :(得分:4)
如果两种类型都继承自相同的基类/接口,则:
BaseTypeClass myExporter;
switch(formatindex)
{
case 0:
myExporter = new PngExporter { Background = OxyColors.Black };
fileExtension = ".jpg";
case 1:
myExporter = new SvgExporter();
fileExtension = ".svg";
}
如果您不能为两者添加一个共同的祖先,则可以考虑创建具有此特征的包装器。
在任何情况下,只要是您考虑使用if-else
的两种情况:
BaseTypeClass myExporter;
if (formatindex == 0)
{
myExporter = new PngExporter { Background = OxyColors.Black };
fileExtension = ".jpg";
}
else
{
myExporter = new SvgExporter();
fileExtension = ".svg";
}
通常,这种功能与Factory的设计模式相匹配,因此我建议您仔细阅读它。