方法 new override virtual

方法 new override virtual

摘 :  http://hacker.cnblogs.com/archive/2004/08/10/31774.aspx

对virtual的说明是对的:(它一般用在基类中,子类中用override)
1.无virtual时,编译期就确定方法的类型了。也即:无法实现多态了。
2.有vitual时,方法在运行时确定类型。可以实现多态,只要子类override基类的vitual方法。(也就是楼主的第2点)。

实现java  动态调用 

 
另外取个方法 与原来无关.


对于new没有说清楚:
new与virtual并没有必然的联系。从字面上看,new声明的方法是一个“新”方法,与基类完全没有关系(虽然不幸与基类的某个方法同名同参)。也即:通过向上转型(如:基类 引用名=new 子类())得到的引用将无法看到子类中new出来的方法。所以会出现楼主第3点中的结果。

 

 







using  System; 

public   class  ClassFather 



public   string  s1; 

//  virtual public void VirFun() 

public   void  VirFun() 

{ Console.WriteLine( 
" base  classfather virFun: " +  s1 );} 




public   class  ClassBoy : ClassFather 



public   new   void  VirFun() 

base .VirFun();} 




public   class  ClassGirl : ClassFather 



public   new   void  VirFun() 



base .VirFun(); 

Console.WriteLine( s1 ); 






public   class  Test 



public   static   void  Main() 



ClassFather a 
=   new  ClassFather(); 

a.s1 
=   " father "

a.VirFun(); 


ClassFather b 
=   new  ClassBoy(); 

b.s1 
=   " boy "

b.VirFun(); 


ClassFather c 
=   new  ClassGirl(); 

c.s1 
=   " girl "

c.VirFun(); 








using  System; 


public   class  ClassFather 



public string s1; 

virtual public void VirFun() 

{ Console.WriteLine( "ClassFather  virfun()(: "+ s1 );} 

}
 


public   class  ClassBoy : ClassFather 



public override void VirFun() 

{
Console.WriteLine( 
"ClassBoy  virfun() : "+ s1 );   // base.VirFun();} 

}
 


public class ClassGirl : ClassFather 



public new void VirFun() 



//base.VirFun(); 

//Console.WriteLine( s1 ); 

 Console.WriteLine( 
"ClassGirl new  virfun() : "+ s1 );

}
 

}
 


public class Test 



public static void Main() 



ClassFather a 
= new ClassFather(); 

a.s1 
= "father"

a.VirFun(); 


ClassFather b 
= new ClassBoy(); 

b.s1 
= "boy"

b.VirFun(); 


ClassFather c 
= new ClassGirl(); 

c.s1 
= "girl"

c.VirFun(); 

}
 

}



你可能感兴趣的:(方法 new override virtual)