c# - C# 中的多态性和静态方法重载。

标签 c# polymorphism overloading

我一直在尝试根据函数 的输入参数(我称之为上下文)生成一个工厂,该工厂应该返回一个公共(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)

只有虚方法调用是多态的(使用覆盖),其中目标对象的实际执行时类型决定调用哪个实现。如果 AB 有一个可以被 Factory.getItem 调用的虚方法(在 B 中重写)是有意义的 来处理差异,这很好......否则你将陷入动态类型或类似 is 的困境。

关于c# - C# 中的多态性和静态方法重载。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6858763/

相关文章:

python - 多态函数的功能注释

c++ - 在 C++ 中使用多态性访问类的孙子类

c++ - 如何重载运算符而不是同时使用 "Curiously Recurring Template Pattern"和 "Run Time polymorphism"

java - Java 是否支持默认参数值?

typescript - 如何让函数传递具有相同重载的参数?

c# - 带用户输入的重载方法 (ReadLine())

javascript - 通过单击 WebBrowser Control 中的按钮来调用 C# 函数

c# - 多播 OnExceptionAspect 正在记录冒泡异常

c# - 事件、委托(delegate)或接口(interface)?

c# - MS Blend 3&4 能否打开包含混合代码的解决方案?