虚拟成员是让继承类来override的,如果是private,继承类都不能看见,怎么override?所以private虚拟成员毫无意义
解决方案 »
- 请熟悉数据库的都进来看看!
- 关于读取Excel时发现日期读不出来System.DBNull
- 哥哥们,马上给分,有没有办法点中DataGridView就是进入了cell?
- 请问:你在一家公司工作半年学的东西多,还是半年内换六家公司学的东西多?我觉得我们公司没什么好学的,也没有高手,当然我也不是,但希
- 太奇怪了!同样的treeview例子,为什么我的就是运行不了?
- TreeView快捷菜单
- 怎样在我的项目里加上ie的功能?有控件吗?怎么加入?
- 非常简单声音检测怎么实现
- 几个基本概念的问题(新手,在线等)
- 如何重载WORD方法??
- 哪里有比较漂亮的软件界面啊?
- 如何在webform的datagrid中选中其中的某行,或者多行记录?
“虚拟成员是让继承类来override的,如果是private,继承类都不能看见,怎么override?”
含义就是如果你用virtual声名了一个虚拟方法,就表示你的这个方法可能被派生类中的方法所取代。
而 private 声名表示这个方法仅能够在类内部使用,不能被外部类/派生类使用,所以private 和 virtual 关键字一起来声名一个方法是冲突的,当然会出现编译器错误,你应该使用
protected virtual 或者 public virtual 来声名你的方法。
当我有一个资源,不想让外界访问, 该怎么办? private,当之无愧.
当我有一个资源,想让子类改写,该怎么办? virtual,当之无愧.当我同时出现上面两种情况,该如何办? private virtual.如果,按照当前C#的意图,我必需在基类改为 protected virtual or public virtual
那么,我的子类若是这么给改写:
public class OneMethod: MethodBase
{
proteced override object GetSpecID()
{
...
base.GetSpecID()
...
}
}
这样会完全打乱我原本设计的企图!! 我不向让外界访问我的资源(此例中:GetSpecID()),
但,遭到访问了. 如果,我里面实现了一个格式化磁盘的方法, 外界在不知情的情况下调用了,....默哀吧.
的有效手段. 上面举的例子,正是这种情况. 但,我不明白,为何C#要抛弃.
{
.... public object Calculate()
{
...
GetSpecID();
...
}
private object GetSpecID(){} ....
}public class OneMethod: MethodBase
{
proteced object GetSpecID()
{
...
base.GetSpecID()
...
}
}
若:
MethodBase obj = new OneMethod();
obj.Caculate(); //里面的GetSpecID() 调谁? 是Base的啊!!
但c#,以及java都是支持public virtual方式!
这也是目前更流行的设计方式!
呵呵,所以c#取消了c++的那种设计模式吧!
***********************************************************************
好像没误会啊!下面是楼主的原话
*********************************************************************
探讨:
当我有一个资源,不想让外界访问, 该怎么办? private,当之无愧.
当我有一个资源,想让子类改写,该怎么办? virtual,当之无愧
*********************************************************
楼主提到的是两个资源还是同一个资源呢?
楼主举的例子,依偶看,可能是两种模式的组合: 策略模式和模板方法
基类的目的就是封装供外围访问接口, 派生子类的目的是实现新算法.
基类的private virtual GetSpecID()的目的,就是要子类改写,
并用语意强制子类无法调用父类的实现. 就是说: base.GetSpecID()
编译将无法通过. 但基类若改写成protected virtual GetSpecID(),
子类调用 base.GetSpecID()编译将通过. 这就意味这楼主所说的
...默哀吧. 呵呵,楼主以为然否?
呵呵,只是除了第一句.我举的例子,模板方法痕迹的确很浓,策略嘛... 模糊一些,可算有也可算无.
因为算法的封装,简单的实现确实有些象,但策略更倚重接口的累积.其实,做设计时,并无刻意去靠模式,只是有时内部讨论时,为表述各自的思想时,
才用模式名称的.