虚拟成员是让继承类来override的,如果是private,继承类都不能看见,怎么override?所以private虚拟成员毫无意义

解决方案 »

  1.   

    同意楼上:
    “虚拟成员是让继承类来override的,如果是private,继承类都不能看见,怎么override?”
      

  2.   

    你应该了解抽象方法(或者抽象成员)的含义。他的作用就是声名成员/类是虚拟成员,虚拟成员的实现可由派生类中的重写成员更改。
    含义就是如果你用virtual声名了一个虚拟方法,就表示你的这个方法可能被派生类中的方法所取代。
    而 private 声名表示这个方法仅能够在类内部使用,不能被外部类/派生类使用,所以private 和 virtual 关键字一起来声名一个方法是冲突的,当然会出现编译器错误,你应该使用
    protected virtual 或者 public virtual 来声名你的方法。
      

  3.   

    哟,大侠果然来了 :)探讨:
    当我有一个资源,不想让外界访问, 该怎么办?  private,当之无愧.
    当我有一个资源,想让子类改写,该怎么办? virtual,当之无愧.当我同时出现上面两种情况,该如何办?  private virtual.如果,按照当前C#的意图,我必需在基类改为 protected virtual or public virtual
    那么,我的子类若是这么给改写:
    public class OneMethod: MethodBase
    {
      proteced override object GetSpecID()
     { 
       ...
       base.GetSpecID() 
       ...
     }
    }
    这样会完全打乱我原本设计的企图!!  我不向让外界访问我的资源(此例中:GetSpecID()),
    但,遭到访问了.  如果,我里面实现了一个格式化磁盘的方法, 外界在不知情的情况下调用了,....默哀吧.
      

  4.   

    在C++中, 继承与访问方式是完全无关的. private virtual 是中常用的保护与重载同用
    的有效手段. 上面举的例子,正是这种情况. 但,我不明白,为何C#要抛弃.
      

  5.   

    public class MethodBase
    {
      ....  public object Calculate()
      {
        ...
         GetSpecID();
        ...
      }
      private object GetSpecID(){}  ....
    }public class OneMethod: MethodBase
    {
      proteced object GetSpecID()
     { 
       ...
       base.GetSpecID() 
       ...
     }
    }
      

  6.   

    楼上的方法行不通啊.
    若:
    MethodBase obj = new OneMethod();
    obj.Caculate(); //里面的GetSpecID() 调谁? 是Base的啊!!
      

  7.   

    嗯,c++是允许这样的!
    但c#,以及java都是支持public virtual方式!
    这也是目前更流行的设计方式!
      
     呵呵,所以c#取消了c++的那种设计模式吧!
      

  8.   

    托管C++还支持>>>当我有一个资源,不想让外界访问, 该怎么办?  private,当之无愧.you can also use protected>>>当我有一个资源,想让子类改写,该怎么办? virtual,当之无愧要让子类改写,至少要用protected, use "protected virtual"我的感觉是, "private virtual" doesn't make sense当然,in C++, 这是有争议的
      

  9.   

    楼上可能误会楼主意思了>>>>>>当我有一个资源,不想让外界访问, 该怎么办?  private,当之无愧.>>>you can also use protected这样,子类就能够访问了. 楼主的意思可能是,连子类也杜绝访问,所以用private.我到也觉得这可能是c#设计者,在整体构架时所做的权衡.
      

  10.   

    唉, 用着用着,又发现C#一个问题:我希望向一个方法,传入一个数据, 方法内部不许对他改写,C#现在好像对此束手无策, 它好像无法象C++那样,用const进行强制声明啊,不爽,很不爽.
      

  11.   

    楼上可能误会楼主意思了>>>>>>当我有一个资源,不想让外界访问, 该怎么办?  private,当之无愧.>>>you can also use protected这样,子类就能够访问了. 楼主的意思可能是,连子类也杜绝访问,所以用private.我到也觉得这可能是c#设计者,在整体构架时所做的权衡.
    ***********************************************************************
    好像没误会啊!下面是楼主的原话
    *********************************************************************
    探讨:
    当我有一个资源,不想让外界访问, 该怎么办?  private,当之无愧.
    当我有一个资源,想让子类改写,该怎么办? virtual,当之无愧
    *********************************************************
    楼主提到的是两个资源还是同一个资源呢?
      

  12.   

    to: firewing(可乐)
    楼主举的例子,依偶看,可能是两种模式的组合: 策略模式和模板方法
    基类的目的就是封装供外围访问接口, 派生子类的目的是实现新算法.
    基类的private virtual GetSpecID()的目的,就是要子类改写,
    并用语意强制子类无法调用父类的实现. 就是说: base.GetSpecID()
    编译将无法通过. 但基类若改写成protected virtual GetSpecID(),
    子类调用 base.GetSpecID()编译将通过. 这就意味这楼主所说的
    ...默哀吧. 呵呵,楼主以为然否?
      

  13.   

    to:_GoHome(大梦未醒)设计意图和private protected区别的解释的都很贴切. 
    呵呵,只是除了第一句.我举的例子,模板方法痕迹的确很浓,策略嘛... 模糊一些,可算有也可算无.
    因为算法的封装,简单的实现确实有些象,但策略更倚重接口的累积.其实,做设计时,并无刻意去靠模式,只是有时内部讨论时,为表述各自的思想时,
    才用模式名称的.