我一直在尝试根据函数 的输入参数(我称之为上下文)生成一个工厂,该工厂应该返回一个公共(public)接口(interface)的不同对象(比如
Item
) getItem(上下文)
现在,假设我定义了一种新的上下文类型:B
,它继承自 A
。
我想根据传递给工厂的对象是 B
类还是 A
类返回不同的项目。
我尝试做如下(重载方法):
class Factory
{
static Item getItem(A context) {...}
static Item getItem(B context) {...}
}
如果我这样做,效果很好:
B bContext=new B();
Item it=Factory.getItem(bContext);
但是,如果我强制转换并反对键入 A
:
A bContext=(A) new B();
Item it=Factory.getItem(bContext);
第一个工厂方法被调用。
我认为多态性即使在转换后也能确保第二个方法的执行,我想知道我是否遗漏了什么?
我知道我可以保持单一方法并使用 is
运算符来检查变量的类型,但我认为我上面提供的解决方案更优雅一些。
最佳答案
重载是在编译时(除了在 C# 4 中使用动态类型)根据参数的编译时类型决定的——在你的最后一个片段中,编译时类型参数是 A
,所以它调用 Factory.getItem(A)
。
只有虚方法调用是多态的(使用覆盖),其中目标对象的实际执行时类型决定调用哪个实现。如果 A
和 B
有一个可以被 Factory.getItem 调用的虚方法(在
来处理差异,这很好......否则你将陷入动态类型或类似 B
中重写)是有意义的is
的困境。
关于c# - C# 中的多态性和静态方法重载。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6858763/