如果一个类不与具体的事物相联系,而只是表达一种抽象的概念,仅仅是作为其派生类的一个基类,这样的类就是抽象类,在抽象类中声明方法时,如果加上abstract时就是抽象方法


抽象类概述及声明


抽象类与非抽象类的主要区别:


①.抽象类不能直接被实例化;


②.抽象类中可以只有抽象方法,也可以只有非抽象方法,也可以抽象方法、非抽象方法都有。(非抽象 类中不能有抽象方法);


③.抽象类不能被密封。


以上会在下面例子中一一验证:

classProgram{staticvoidMain(string[]args){Mm=newM();//错误提示:无法创建抽象类或接口M的实例。验证了①,抽象类和接口不能被实例化}}publicabstractclassM{publicvoidA(){Console.WriteLine("调用了A方法");}publicabstractvoidB()//错误提示:M.B()无法声明主体,因为它标记为abstract。也就是说,抽象方法不能有方法体。{Console.WriteLine("调用了B方法");}publicabstractvoidG();}publicclassC{publicabstractvoidH();//错误提示:C.D()是抽象的,但它包含在非抽象类C中。再对比M类中的方法A()、B()来看,就验证了②:非抽象类中不能有抽象方法;抽象类中可以只有抽象方法,也可以只有非抽象方法,也可以抽象方法、非抽象方法都有。publicvoidD(){}}publicsealedabstractclassE//错误提示:E是抽象类,它不能是密封(sealed)或静态(static)的。这就验证了③。{}publicstaticabstractclassF//错误提示:F是抽象类,它不能是密封(sealed)或静态(static)的。这就验证了③。{}


2.抽象方法概述及声明


声明抽象方法时需注意:


①.抽象方法必须声明在抽象类中(上面已经验证); 

②.声明抽象方法时,不能使用virtual、static、private、sealed修饰符;

③.在抽象类中抽象方法不提供实现。


下面例子中会一一验证:

classProgram{staticvoidMain(string[]args){}}publicabstractclassM{publicabstractvoidA();publicvirtualabstractvoidB();//错误提示:抽象方法B不能标记为virtual。因为虚方法和抽象方法属于同一个等级的,并列关系。publicstaticabstractvoidC();//错误提示:静态成员C不能标记为overrid、virtual或abstract。privateabstractvoidD();//错误提示:虚拟成员或抽象成员不能是私有的。因为虚拟成员是让继承类来override的,如果是private,继承类都不能看见;抽象方法要是私有的话,这个抽象方法所在的抽象类的子类就没法实现这个抽象方法,看不见。A();//抽象方法在自己的抽象类中不能有方法体,所以不能在本类中实现。要在继承类中实现。}


3.抽象类与抽象方法的使用


直接举例子:

usingSystem;usingSystem.Collections.Generic;usingSystem.Text;namespace_{publicabstractclassmyClass{privatestringid="";privatestringname="";///<summary>///编号属性及实现///</summary>publicstringID{get{returnid;}set{id=value;}}///<summary>///姓名属性及实现///</summary>publicstringName{get{returnname;}set{name=value;}}///<summary>///抽象方法,用来输出信息///</summary>publicabstractvoidShowInfo();}publicclassDriveClass:myClass//继承抽象类{///<summary>///重写抽象类中输出信息的方法///</summary>publicoverridevoidShowInfo(){Console.WriteLine(ID+""+Name);}}classProgram{staticvoidMain(string[]args){//实例化派生类DriveClassdriveclass=newDriveClass();//使用派生类对象实例化抽象类myClassmyclass=driveclass;//使用抽象类对象访问抽象类中的编号属性myclass.ID="BH0001";//使用抽象类对象访问抽象类中的姓名属性myclass.Name="TM";//使用抽象类对象调用抽象类中的的抽象方法myclass.ShowInfo();}}}


上例中通过派生类的对象driveclass来实例化抽象类,然后使用抽象类访问抽象类中的属性及方法。