C#中静态方法的多态性和重载.

SRK*_*RKX 8 c# polymorphism overloading

我一直在试图产生应该返回一个通用接口(比如一个不同的对象工厂Item根据输入参数)(我称之为上下文)的功能getItem(A context)

现在,假设我定义了一种新的上下文:B继承自A.

我想返回一个不同的项目,具体取决于传递给工厂的对象是类B还是A.

我试着做如下(重载方法):

class Factory
{
   static Item getItem(A context) {...}
   static Item getItem(B context) {...}
}
Run Code Online (Sandbox Code Playgroud)

如果我做这样的事情,这工作正常:

B bContext=new B();
Item it=Factory.getItem(bContext);
Run Code Online (Sandbox Code Playgroud)

但是,如果我转换并反对键入A:

A bContext=(A) new B();
Item it=Factory.getItem(bContext);
Run Code Online (Sandbox Code Playgroud)

调用第一个工厂方法.

我认为即使在演员之后,多态也会确保第二种方法的执行,我想知道我是否错过了什么?

我知道我可以继续使用单一方法并使用is运算符来检查变量的类型,但我认为上面提到的解决方案更优雅.

Jon*_*eet 10

根据参数的编译时类型,在编译时决定重载(除了在C#4中使用动态类型) - 在最后一个片段中,参数的编译时类型是A,所以它调用Factory.getItem(A).

只有虚方法调用是多态的(使用重写),其中目标对象的实际执行时类型决定调用哪个实现.如果它是有道理的A,并B有一个虚拟方法(覆盖在B),它可以通过调用Factory.getItem来处理分歧,这是伟大的......否则你坚持无论是动态类型或类似的东西is.