abstract抽象类和抽象方法
abstract可以用来修饰类,方法,属性,索引器和时间,这里不包括字段. 使用abstrac修饰的类,该类只能作为其他类的基类,不能实例化,而且abstract修饰的成员在派生类中必须全部实现,不允许部分实现,否则编译异常.在方法或属性声明中使用abstract修饰符以指示方法或属性不包含实现。
含有abstract修饰符的class即为抽象类,抽象类是特殊的类,只是不能被实例化,可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例;除此以外,具有类的其他特性;重要的是抽象类可以包括抽象方法,这是普通类所不能的。抽象方法只能声明于抽象类中,且不包含任何实现,派生类必须覆盖它们。另外,抽象类可以派生自一个抽象类,可以覆盖基类的抽象方法也可以不覆盖。
抽象类拥有如下特征:
1,抽象类不能被实例化, 但可以有实例构造函数, 类是否可以实例化取决于是否拥有实例化的权限 (对于抽象类的权限是abstract, 禁止实例化),
即使不提供构造函数, 编译器也会提供默认构造函数;
2,抽象类可以包含抽象方法和访问器;
3,抽象类不能使用sealed修饰, sealed意为不能被继承;
4,所有继承自抽象类的非抽象类必须实现所有的抽象成员,包括方法,属性,索引器,事件;
abstract修饰的方法有如下特征:
1,抽象方法即是虚拟方法(隐含);
2,抽象方法只能在抽象类中声明;
3,因为抽象方法只是声明, 不提供实现, 所以方法只以分号结束,没有方法体,即没有花括号{}部分;如
public abstract void 抽象方法();
4,override修饰的覆盖方法提供实现,且只能作为非抽象类的成员;
5,在抽象方法的声明上不能使用virtual或者是static修饰.即不能是静态的,又因为abstract已经是虚拟的,无需再用virtual强调.
抽象属性尽管在行为上与抽象方法相似,但仍有有如下不同:
1,不能在静态属性上应用abstract修饰符;
2,抽象属性在非抽象的派生类中覆盖重写,使用override修饰符;
抽象类与接口:
1,抽象类必须提供所有接口成员的实现;
2,继承接口的抽象类可以将接口的成员映射位抽象方法.
抽象类不可以直接实例化,他可以有n个(n>=0)抽象方法,这些抽象方法子类必须实现.
实例:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace abstract抽象方法和类 { class Program { static void Main(string[] args) { //抽象类 cxl = new 抽象类(); //错误的,抽象类无法实例化。只能被继承 普通类 p = new 普通类(); //实例化一个普通类。 p.抽象方法(); //调用抽象类里面的抽象方法。 p.普通方法(); //调用抽象类里面的普通方法。 p.普通类内的普通方法();//调用普通类内的普通方法。 p.name = "抽象类名字"; //子类“普通类”调用“父类”抽象类的字段。 p.Age = 10;//调用属性 Console.WriteLine("普通类可以继承抽象内的字段,属性..名字:{0},年龄:{1}",p.name, p.Age);//输出。 Console.ReadKey();//按任意键结束。 } } //定义一个抽象类,抽象类只能被继承,不能被实例化。 //抽象类中可以包含抽象方法和普通方法。 abstract class 抽象类 { public string name; private int age;//抽象类内可以包含字段。 public int Age //抽象类内可以包含属性。 { get{return age;} set{age = value;} } public 抽象类() { Console.WriteLine("抽象类的默认构造方法(函数)"); } public abstract void 抽象方法();//定义一个抽象方法,抽象方法必须包含在抽象类中。抽象方法只声明,不提供实现,所以没有{}。 public void 普通方法() //普通方法要包括 {} 来实现。 { Console.WriteLine("抽象类内的普通方法。"); } } class 普通类 : 抽象类 //普通类继承抽象类后,必须实现抽象类中的 抽象方法。 { //实现抽象方法,override重写,是在子类中重写父类中的方法,两个函数的函数特征(函数名、参数类型与个数)相同。 //用于扩展或修改继承的方法、属性、索引器或事件的抽象或虚拟实现。 //提供从基类继承的成员的新实现,而通过override声明重写的方法称为基方法。 public override void 抽象方法() { Console.WriteLine("在普通类内实现抽象类中的抽象方法。(必须的)"); } public void 普通类内的普通方法() { Console.WriteLine("普通类内的普通方法。"); } } }
输出结果:
个人理解:抽象类比如是写一个游戏,这个游戏要有人物名字,人物年龄,人物初始等级,人物初始属性之类的,可以先把必要的信息抽象出来。在写其他类的时候可以直接继承,无须重复写。