在switch语句中实例化一个对象,但不能在switch语句的作用域之外使用它
本文关键字:语句 switch 作用域 但不能 实例化 一个对象 | 更新日期: 2023-09-27 18:01:28
我有一个PDF"窗口贴纸"模板类,我可以使用所有的汽车经销商,但这一个经销商想自定义他的方式,而不是所有经销商的方式。
因此,我为那个特定的经销商创建了第二个PDF"Window Sticker"模板类。
然后我发现由于范围问题,我在任何特定经销商的switch语句中实例化它时遇到了麻烦。有什么解决方法,或者其他方法吗?
public class Foo1
{
public Foo1() { }
public string GeneratePdf() { return "Red"; }
}
public class Foo2
{
public Foo2() { }
public string GeneratePdf() { return "Blue"; }
}
Object pdfTemplate;
long dealerAccountId = 121; //247
switch(dealerAccountId)
{
case 247:
pdfTemplate = new Foo2();
break;
default:
pdfTemplate = new Foo1();
break;
}
string color = pdfTemplate.GeneratePdf();
问题不在于范围。它是pdfTemplate
变量的类型。Object
不能解决这个问题。您应该创建一个具有GeneratePdf
方法的接口,并将其用作类型。否则它不知道pdfTemplate
变量的可能方法,如GeneratePdf
。
public interface IGenerator
{
string GeneratePdf();
}
public class Foo1 : IGenerator
{
public Foo1() { }
public string GeneratePdf() { return "Red"; }
}
public class Foo2 : IGenerator
{
public Foo2() { }
public string GeneratePdf() { return "Blue"; }
}
IGenerator pdfTemplate;
long dealerAccountId = 121; //247
switch(dealerAccountId)
{
case 247:
pdfTemplate = new Foo2();
break;
default:
pdfTemplate = new Foo1();
break;
}
string color = pdfTemplate.GeneratePdf();
为了让OP理解他对dynamic
的选择,请不要使用这个
当使用dynamic
时,它将尝试在运行时解析您调用的方法。编译器不会警告您一个不存在的方法,它只会假设它在运行时存在(换句话说:bug只在编译后可见,可能在发布产品后可见)。你不需要接口。
dynamic pdfTemplate;
...
string color = pdfTemplate.GeneratePdf();
这将只是工作,没有麻烦,只是工作代码。(检查如果你打错了会发生什么,比如generatepdf()
)
问题是pdfTemplate
类型为object
,而object
类型没有GeneratePdf()
方法。即使您分配给变量的对象是Foo1
/Foo2
类型之一,变量本身的类型也是object
。这很重要。
变量必须是具有GeneratePdf()
方法的类型。看起来两个Foo类至少都有这个方法。这意味着它们既可以继承相同的基类,也可以实现相同的接口。我推荐后者。所以你会有这个:
public interface IFoo
{
string GeneratePdf();
}
public class Foo1 : IFoo
{
public Foo1() { }
public string GeneratePdf() { return "Red"; }
}
public class Foo2 : IFoo
{
public Foo2() { }
public string GeneratePdf() { return "Blue"; }
}
IFoo pdfTemplate;
long dealerAccountId = 121; //247
switch(dealerAccountId)
{
case 247:
pdfTemplate = new Foo2();
break;
default:
pdfTemplate = new Foo1();
break;
}
string color = pdfTemplate.GeneratePdf();
试试这个:
public abstract class FooBase
{
public abstract string GeneratePdf();
}
public class Foo1 : FooBase
{
public Foo1() { }
public override string GeneratePdf() { return "Red"; }
}
public class Foo2 : FooBase
{
public Foo2() { }
public override string GeneratePdf() { return "Blue"; }
}
同样,修改这一行:
Object pdfTemplate
这:
FooBase pdfTemplate;
剩下的代码可以了。