一.子类和父类方法之间的关系
1.当子类和父类有方法完全相同的方法
namespace ConsoleApplication2 { class Program { static void Main(string[] args) { B b = new B(); A a = new A(); A c = new B(); b.Show(); a.Show(); c.Show(); Console.Read(); } } public class A { public void Show() { Console.WriteLine("执行A的Show方法"); } } public class B : A { public void Show() { Console.WriteLine("执行B的Show方法"); } } }
这里先给出运行的结果:
由此可以得出结论:
①当子类和父类的方法完全相同时,调用的时候取决于声明的类型(“=”左边),而不是实例化的类型。
②这样情况应该尽量避免,编译器会警告,但是不会妨碍程序的执行。
③当有同名的字段时,同样使用new来消除警告
可以使用new关键字消除警告,但是运行结果一样。
2.virtural方法和override方法调用
修改代码如下:
View Code
namespace ConsoleApplication2 { class Program { static void Main(string[] args) { B b = new B(); A a = new A(); A c = new B(); b.Show(); a.Show(); c.Show(); Console.Read(); } } public class A { public virtual void Show() { Console.WriteLine("执行A的Show方法"); } } public class B : A { public override void Show() { Console.WriteLine("执行B的Show方法"); } } }
执行结果:
由此可以知道:重写以后,调用哪个类的方法取决于实例化的类型(“=”右边)或者是转换后最终的类型