请看代码:
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的对象吗?为什么?
因为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对象 呵呵 继承关系两者
调用的时候再传递子类就可了,而且这个样是提倡的,我们依赖抽象,不要依赖具体