首页 新闻 会员 周边

关于方法的重写

0
[已解决问题] 解决于 2011-11-09 09:07

请看代码:

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

问题补充:

其中 BasePage是Page的子类,即传入的参数还是Page的对象

飞~翔的主页 飞~翔 | 初学一级 | 园豆:149
提问于:2011-11-08 10:57
< >
分享
最佳答案
-1

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

水牛刀刀 | 大侠五级 |园豆:6350 | 2011-11-08 11:53
其他回答(2)
-1

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

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

堂堂88 | 园豆:9 (初学一级) | 2011-11-08 12:01
0

调用的时候再传递子类就可了,而且这个样是提倡的,我们依赖抽象,不要依赖具体

小小刀 | 园豆:1991 (小虾三级) | 2011-11-08 23:21
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册