抽象类:abstract
就是用来被继承的,不能实例化对象,因为没有构造函数;
抽象方法,不能有方法的主体,只能定义方法的结构;
抽象类可以被子类继承,在子类中需要把方法主体写清楚,调用时直接实例化一下子类,直接调用子类中写的方法
抽象类虽然不能实例化,但可以实例化等于子类,如:抽象类名 a=new 子类名,这样就可以直接调用子类中的方法
抽象类中也可以写普通方法和虚方法,普通方法不可以在子类中重写,只能被继承,而虚方法可以在子类中被重写
抽象方法或抽象属性,只能存在于抽象类中;
抽象类中不一定只有抽象方法和抽象属性;
例:
创建一个项目,添加一个抽象类,再添加一个子类:
抽象类:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 抽象类 { abstract class sport //创建一个项目,添加一个父类,class前面添加关键词abstract,就是一个抽象类 { public abstract void sp();//添加使用方法时在访问修饰符的后面也加上abstract,不能有函数体 public abstract void rt();//抽象类可以做为父类被继承,但因为抽象类中没有方法主体, //需要在子类中写清楚 //在抽象类中也可以添加普通的使用放法 public void paobu() { Console.WriteLine("用腿跑步");//这样的方法就<不可以>在子类中被重写 } //抽象类中也可以由虚方法,虚方法关键词virtual public virtual void chifan() { Console.WriteLine("用嘴吃饭");//虚方法可以在子类中进行重写 } } }
子类:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 抽象类 { class swim:sport //添加一个子类继承这个抽象类,因为抽象类中没有方法主体,需要在子类中写清楚 { public override void sp() //添加时同样用重写关键词override; { Console.WriteLine("我喜欢运动"); } public override void rt() { Console.WriteLine("我喜欢游泳"); } public override void chifan()//在父类中这是一个虚方法,可以重写 { Console.WriteLine("大口吃饭"); } } }
Program:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 抽象类 { class Program { static void Main(string[] args) { sport cs = new sport(); //出现报错,抽象类,就是用来被继承的,不能实例化对象,因为没有构造函数; sport cs = new swim();//抽象类不能实例化对象,但是他可以new 他的子类swim cs.chifan(); // 这样调用的是它子类里面的方法 cs.paobu(); cs.rt(); cs.sp(); Console.WriteLine("======================================="); swim sw = new swim();//子类swim继承了sport这个抽象类,并且写了方法主体,就可以实例化使用 sw.rt();//现在可以直接点出抽象类被继承后,在子类中写完主体的使用方法 sw.sp(); sw.paobu();//这是在抽象类中写的一个普通方法,不可以在子类中重写,直接被子类继承,可以直接点出使用 sw.chifan();//这是在抽象类中写的一个虚方法,可以在子类中重写 Console.ReadLine(); } } }