一,抽象的实现
代码如下 | 复制代码 |
usingSystem; usingSystem.Collections.Generic; usingSystem.Linq; usingSystem.Text;
namespaceVirtualdemo { classProgram { staticvoidMain(string[] args) {//BClass A = new BClass(); 抽象类无法被实例 Class1 c =newClass1(); BClass c2 = c; c2.MethodA(); c.MethodA(); c2.MethodB(); c.MethodB(); c2.MethodC(); c.MethodC(); Console.ReadKey(); } } abstractclassBClass //抽象类无法被实例 { publicvirtualvoidMethodA() { Console.WriteLine("BClassA"); } publicvirtualvoidMethodB() { Console.WriteLine("BClassB"); } publicvirtualvoidMethodC() { Console.WriteLine("BClassC"); } } classClass1 : BClass { publicvoidMethodA() { Console.WriteLine("MethodA"); }//如果一个虚函数 在子类中没有通过override关键字,那么这个方法就没有被重写,而是被隐藏了 publicoverridevoidMethodB() { Console.WriteLine("MethodB"); } publicoverridevoidMethodC() {base.MethodC(); } } } |
从上图得出的结果是:
综上:抽象类的虚方法需要被重写,那问题来了重写有两种方式,new和override又有什么区别
二,new和override重写的区别:
代码如下 | 复制代码 |
usingSystem; usingSystem.Collections.Generic; usingSystem.Linq; usingSystem.Text;
namespaceVirtualdemo { classProgram { staticvoidMain(string[] args) { Teacher t =newTeacher(); Student stu = t; stu.Exam(); stu.Say(); t.Say(); Console.ReadKey(); } } publicabstractclassStudent { publicvirtualvoidExam() { Console.WriteLine("学生都要考试"); } publicvoidSay() { Console.WriteLine("我是学生"); } } publicclassTeacher : Student { publicoverridevoidExam() { Console.WriteLine("老师不用考试"); } //public override void Say() //报错,提示没有virtual,无法被重写 //{ // Console.WriteLine("我是老师"); //} publicnewvoidSay() { Console.WriteLine("我是老师"); } } } |
结果显示为:
综上总结:
1、如果基类没有定义虚方法,那子类只能使用new,而不能使用override
2、基类有没有定义虚方法,子类都可以使用new
3、子类使用new并不叫重写,而是子类新创建一个方法,只是新创建的这个方法刚好跟基类中的方法同名