new、abstract、virtual、override,sealed关键字区别和使用代码示例
2012-07-06 09:53
531 查看
using System; namespace Text3 { //new、abstract、virtual、override,sealed关键字区别和使用代码示例 //new 与 override的区别 //覆写(override)与重载(overload),是成就.NET面向对象多态特性的基本技术之一 //正如某网友说的那一句话: //Override 覆写 就是把原来的换掉了 //new 新的 就是两个共存着 //使用override重写xx方法,通过父类引用【子类的实例对象】,只能看到重写后的方法; //如果使用new隐藏xx方法,父类子类引用各自对应方法; //override重写虚方法,那么就只剩下重写以后的方法; //new隐藏基类的方法,那么基类的方法和当前类的方法同时存,在只是被隐藏了; //使用override修饰符主要用来修改方法、属性、索引器或事件。重写基方法必须与重写方法具有相同的名称。 // 不能重写非虚方法或静态方法。重写基方法必须是虚拟的、抽象的或重写的。 // 重写声明不能更改虚方法的可访问性。重写方法和虚方法必须具有相同的访问级修饰符。 // 例如:虚方法为public的,重新方法也必须是public的。 // 不能使用下列修饰符修改重写方法: // new static virtual abstract //重写属性 声明必须指写与继承属性完全相同的访问修饰符、类型和名称,并且重写属性必须是虚拟的、抽象的或是重写的。 //要求:(三相同) //1、方法名称相同 //2、参数列表相同 //3、返回值类型相同 //一句话,只需要重新写方法内部的内容! //,override可以覆盖基类的方法,让基类的方法以子类的内容实现, //而new不用来覆盖基类的方法,而是全新定义一个子类的方法,这个方法只属于子类,与基类的方法无关,只是名字上相同而已 //先看abstract和override使用方法 abstract class Base { public virtual void work() { Console.WriteLine("基类--开始工作"); } public virtual void outwork() { Console.WriteLine("基类--下班"); } public abstract void Pay(); //声明抽象方法,必须要被子类new 或 override;只有当类是abstract时才可以声明abstract方法 } class Employee : Base { public new void work() { Console.WriteLine("子类(new)--开始工作"); } public override void outwork() //覆写抽象方法(一定要在子类覆写父类的抽象方法) { Console.WriteLine("子类(override)下班"); } public override void Pay() { throw new NotImplementedException(); } } //测试代码 //Code //new声明的方法,当使用子类的类型来调用的时候,它会运行子类中的函数, //而如果类型是基类的话,被隐藏的基类函数就会站到前台来。只有使用virtual定义基类中的函数,并使用override标记子类中的函数, //才可以达到想要的多态类(始终调用子类的方法)。 //在子类中new父类中的方法,父类中的方法不一定是虚类型,即virtual //但是在子类中override父类中的方法,父类的方法一定得是虚类型, //代码示例: abstract class Animal { public abstract void Drink(); public abstract void GotoBed(); } class Dog : Animal { public override void Drink() { Console.WriteLine("小狗喝水"); } public override void GotoBed() { Console.WriteLine("小狗睡觉"); } public override string ToString() //也可:public new string ToString() { return "小狗"; } } //总结: //1、 抽象方法,必须要被子override;只有当类是abstract时才可以声明abstract方法 //2、 因为abstract方法没有方法实现,其子类只能对其abstract方法进行override,不能new // 【如果可以new的话,那么类的类型是父类的话,类的方法执行的是父类的方法而非子类的方法,而父类的方法却没有方法实现,那么将如何执行呢?】 //3、 Selaed 方法必须与override连用,也就是说实现sealed方法的类的父类必须实现了此方法 //(sealed关键字有两个作用:1,密封类不能被继承。2:密封方法重写基类中的方法,但其本身不能在任何派生类中进一步重写,Selaed 方法必须与override连用) // 如下,A声明了virtual方法A1,那么A的子类AA才能对Pay进行密封重写,AA的子类不能对A1重写或覆盖。 //sealed方法的使用代码示例: class A { public virtual void A1() { Console.WriteLine("A---A1"); } } class AA : A { public sealed override void A1() { Console.WriteLine("AA---A1"); } } //总结: //Public abstract void pay(); abstract方法没有方法实现,必须继承 //Public sealed override void pay(){} sealed方法必须是重写父类的方法 //Public static void pay(){} static方法通过类名访问 //Public virtual void pay(){} virtual方法子类可以对其override或new //Public new void pay(){} 父类的方法pay不一定是virtual //Public override void pay(){} 父类的方法pay一定要是virtual }
相关文章推荐
- new、abstract、virtual、override,sealed关键字区别和使用代码示例
- new、abstract、virtual、override,sealed关键字区别和使用代码示例
- C#多态;父类引用指向子类对象;new和override的区别;new、abstract、virtual、override,sealed关键字区别和使用代码示例;c#类的初始化顺序
- new、abstract、virtual、override,sealed关键字区别和使用代码示例
- abstract、override、new、virtual、sealed使用和示例
- sealed,new,virtual,abstract与override关键字的区别?
- c#中abstract、override、new、virtual、sealed使用和示例
- c#中abstract、override、new、virtual、sealed使用和示例
- c#中abstract、override、new、virtual、sealed使用和示例
- c#中abstract、override、new、virtual、sealed使用和示例
- sealed,new,virtual,abstract与override关键字的区别?
- c#的new、abstract、virtual、override,sealed关键字区别
- c#中abstract、override、new、virtual、sealed使用和示例
- C# 关键字 abstract, virtual, override, sealed, new
- C#的主要 关键字 new、sealed、partial、interface、virtual、abstract、this、base、override、return、break、continue...
- Sealed,new,virtual,abstract与override的区别
- C#继承之base,virtual,override,abstract,new,sealed关键字
- C#.NET中new, override, virtual abstract关键字的区别
- 关于抽象、继承中virtual、abstract、override、new关键字的区别
- Sealed,new,virtual,abstract与override的区别