C#中静态方法的多态性和重载.
发布时间:2020-12-15 07:55:33 所属栏目:百科 来源:网络整理
导读:我一直在尝试根据函数getItem(A context)的输入参数(我称之为上下文)生成一个应该返回公共接口(比如Item)的不同对象的Factory 现在,假设我定义了一种新的上下文:B继承自A. 我想根据传递到工厂的对象是B类还是B类返回不同的项目. 我试着做如下(重载方法): c
我一直在尝试根据函数getItem(A context)的输入参数(我称之为上下文)生成一个应该返回公共接口(比如Item)的不同对象的Factory
现在,假设我定义了一种新的上下文:B继承自A. 我想根据传递到工厂的对象是B类还是B类返回不同的项目. 我试着做如下(重载方法): 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有一个虚拟方法(在B中被覆盖)是有意义的,可以由Factory.getItem调用来处理差异,这很好……否则你会遇到动态类型或类似的东西. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |