public class Father { public void Say() { Console.WriteLine("I am Father"); } } public class Son : Father { public void Say() { Console.WriteLine("I am Son"); } } class Program { static void Main(string[] args) { Father f = new Father(); Father s = new Son(); Son so = new Son(); f.Say(); s.Say(); so.Say(); Console.Read(); } }
public class Father { public void Say() { Console.WriteLine("I am Father"); } } public class Son : Father { public new void Say() { Console.WriteLine("I am Son"); } } class Program { static void Main(string[] args) { Father f = new Father(); Father s = new Son(); Son so = new Son(); f.Say(); s.Say(); so.Say(); Console.Read(); } }
没有警告了
public class Father { public void Say() { Console.WriteLine("I am Father"); } } public class Son : Father { public override void Say() { Console.WriteLine("I am Son"); } } class Program { static void Main(string[] args) { Father f = new Father(); Father s = new Son(); Son so = new Son(); f.Say(); s.Say(); so.Say(); Console.Read(); } }
public class Father { public virtual void Say() { Console.WriteLine("I am Father"); } } public class Son : Father { public void Say() { Console.WriteLine("I am Son"); } } class Program { static void Main(string[] args) { Father f = new Father(); Father s = new Son(); Son so = new Son(); f.Say(); s.Say(); so.Say(); Console.Read(); } }
public class Father { public virtual void Say() { Console.WriteLine("I am Father"); } } public class Son : Father { public new void Say() { Console.WriteLine("I am Son"); } } class Program { static void Main(string[] args) { Father f = new Father(); Father s = new Son(); Son so = new Son(); f.Say(); s.Say(); so.Say(); Console.Read(); } }
没有警告了
public class Father { public virtual void Say() { Console.WriteLine("I am Father"); } } public class Son : Father { public override void Say() { Console.WriteLine("I am Son"); } } class Program { static void Main(string[] args) { Father f = new Father(); Father s = new Son(); Son so = new Son(); f.Say(); s.Say(); so.Say(); Console.Read(); } }
总结:
无 virtual 无
new
override
override不能单独使用,要和virtual一起使用。
对于非虚的方法,CLR运行的时候并不会进行类型检查,而是直接运行该引用的类型中所定义的方法,即使这个引用所指向的实际类型是该引用类型的派生类,并且在派生类中存在着同名同参的方法,也不会运行派生类中定义的方法。
但是如果在基类中显示声明方法为虚方法,那么CLR在运行的时候会进行类型检查,如果发现引用类型和实际的对象类型不一致,就会检查派生类中是否覆盖(override)了基类中的方法,如果是,则会运行派生类中的方法,而不是引用类型中的方法。