猿问

关于方法的重写

请看代码:


 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的对象吗?为什么?


千巷猫影
浏览 504回答 2
2回答

达令说

因为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 修饰符时,该方法将重写所继承的具有相同签名的虚方法。虚方法声明用于引入新方法,而重写方法声明则用于使现有的继承虚方法专用化(通过提供该方法的新实现)。

月关宝盒

 既然叫重写 那么函数签名肯定就必须相同。必须传Page对象 你重写的时候传的Page对象  调用的时候可以传BacePage对象 呵呵  继承关系两者
随时随地看视频慕课网APP
我要回答