为了账号安全,请及时绑定邮箱和手机立即绑定

关于方法的重写

关于方法的重写

千巷猫影 2018-08-10 08:06:55
请看代码: 1 public abstract class ViewBaseContainer : Page  2  {  3     protected abstract ControllerBaseContainer CreateConcreteContainer (Page owner);  4  }  5 public class BasePage : ViewBaseContainer   6 {  7     protected override ControllerBaseContainer CreateConcreteContainer(BasePage owner)  8     {  9     } 10 }在BasePage中重写方法CreateConcreteContainer(),传递的参数是BasePage的对象,会导致编译失败,这里传递的参数必须为Page的对象吗?为什么?
查看完整描述

2 回答

?
达令说

TA贡献1821条经验 获得超6个赞

因为override基类的virtual方法必须保证签名相同,参见:C#语言规范4.0,第1.6.6.4节。摘录如下:

1.6.6.4 虚方法、重写方法和抽象方法

若一个实例方法的声明中含有 virtual 修饰符,则称该方法为虚方法 (virtual method)。若其中没有virtual 修饰符,则称该方法为非虚方法 (non-virtual method)。

在调用一个虚方法时,该调用所涉及的实例的运行时类型 (runtimetype) 确定了要实际调用的方法实现。在非虚方法调用中,实例的编译时类型 (compile-timetype) 负责做出此决定。

虚方法可以在派生类中重写 (override)。当某个实例方法声明包括 override 修饰符时,该方法将重写所继承的具有相同签名的虚方法。虚方法声明用于引入新方法,而重写方法声明则用于使现有的继承虚方法专用化(通过提供该方法的新实现)。


查看完整回答
反对 回复 2018-08-13
?
月关宝盒

TA贡献1772条经验 获得超5个赞

 既然叫重写 那么函数签名肯定就必须相同。必须传Page对象 

你重写的时候传的Page对象  调用的时候可以传BacePage对象 呵呵  继承关系两者


查看完整回答
反对 回复 2018-08-13
  • 2 回答
  • 0 关注
  • 485 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信