(转)Overridable、Overrides、Shadows的用法

Public   Class   TheBase  
          Public   Overridable   Sub   a()  
                  Debug.Writeline("TheBase")  
          End   Sub  
  End   Class  
   
  Public   Class   TheInherited  
          Inherits   TheBase  
          Public   Overrides   Sub   a()  
                  Debug.Writeline("TheInherited")  
          End   Sub  
  End   Class  
   
  Public   Class   TheShadowed  
          Inherits   TheInherited  
          Public   Shadows   Sub   a()  
                  Debug.Writeline("TheShadowed")  
          End   Sub  
  End   Class  
   
  '情况一:  
  Dim   c   As   TheBase  
  c   =   New   TheBase()  
  c.a()                                   '   输出   TheBase  
  c   =   New   TheInherited()  
  c.a()                                   '   输出   TheInherited  
  c   =   New   TheShadowed()  
  c.a()                                   '   输出   TheInherited  
   
  '情况二:  
  Dim   c   As   TheInherited  
  c   =   New   TheBase()  
  c.a()                                   '   错误!无效的转换。  
  c   =   New   TheInherited()  
  c.a()                                   '   输出   TheInherited  
  c   =   New   TheShadowed()  
  c.a()                                   '   输出   TheInherited  
   
  '情况三:  
  Dim   c   As   TheShadowed  
  c   =   New   TheBase()  
  c.a()                                   '   错误!无效的转换。  
  c   =   New   TheInherited()  
  c.a()                                   '   错误!无效的转换。  
  c   =   New   TheShadowed()  
  c.a()                                   '   输出   TheShadowed  
   
   
  此例说明Overridable、Overrides、Shadows的用法。  
  请注意TheBase里面的Overridable,如果没有这一句,后面类TheInherited将无法声明同名过程a(),而TheShadows仍然可以。  
  Overridable   的意思是:可以被重写的。  
  Overrides   的意思是:重写原来的。  
  Shadows   的意思是:这个函数/过程/变量跟我的父类没有任何关系,它是一个全新的过程。  
   
  在运行的例子中我们可以清晰地看到,无论变量c的定义是什么,VB.NET都会尽量寻找到最后被定义的那个成员。也就是说,如果被重写了,那么就找“从变量类型开始,到这个变量所指对象实际上的类为止,最后一次被重写(Overrides)的那个成员”。(当然,如果找不到,那么还会往变量类型的祖先那个方向上去找。)  
   
  简单点讲就是说,无论c怎么定以,如果他指向的是一个TheBase,他就找“到TheBase为止最后一次被重写的那个Sub   a()”。如果他指向的是一个TheInherited,就找“到TheInherited为止最后一次被重写的那个Sub   a()”,也就是TheInherited里面的那个。  
   
  对于TheShadowed来说,情况稍微复杂一点:  
  由于TheShadowed里面所写的那个a()被声明为Shadows的,也就是说这个a()跟TheBase和TheInherited里面的没有关系,于是从变量c的基类(TheBase)开始找,一直找到变量所指对象的类型TheShadowed,发现变量c的类型(无论是TheBase还是TheInherited)里面的那个a()最后一次被重写是在TheInherited里面(注意:TheShadows里面的a()跟它没关系),于是只要c不是Dim   ..   As   TheShadows,那么就会选择调用TheInherited里面的a()了。  

你可能感兴趣的:((转)Overridable、Overrides、Shadows的用法)