一,抽象的实现
代码如下 | 复制代码 |
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并不叫重写,而是子类新创建一个方法,只是新创建的这个方法刚好跟基类中的方法同名
梦想家园汉化版 最新版v1.3.0
梦想家园汉化安卓版是一款以泡泡玛特为主题,玩法独特的模拟经营
服从我 (Obey Me!)安卓版v8.1.11
服从我(obey me)是一款让你陷入ikemen恶魔们深情
佩皮超级商店 免费版v1.13.1
佩皮超级商店(Pepi Super Stores)是一款经营
船舶墓地模拟器内置菜单最新版本 v142
船舶墓地模拟器内置菜单版是一款模拟经营类游戏,玩家们将在这里
铠甲勇士捕将变身器模拟器 最新版v1.5
铠甲勇士捕将变身器模拟器是一款有着丰富选择的腰带召唤器,该召