## 一、抽象类1. **定义**使用 abstract 关键字修饰的类叫做**抽象类**。它是一种**不能被实例化**、专门用来做**父类**、被继承的类。2. **核心特点必背**- 不能直接 new 创建对象、、、csharpusing System;// 定义抽象类使用 abstract 修饰abstract class Animal{// 抽象方法无方法体public abstract void Cry();}- 必须被**子类继承**才能使用// 子类继承抽象类class Dog : Animal{// 子类必须重写抽象方法public override void Cry(){Console.WriteLine(汪汪汪);}}class Program{static void Main(){// Animal animal new Animal(); // 报错抽象类不能直接实例化// 只能通过子类实例化向上转型使用Animal dog new Dog();dog.Cry();Console.ReadKey();}}- 可以包含**字段、属性、普通方法、构造方法、抽象方法**、、、csharpusing System;// 抽象类abstract class Person{// 1. 字段public string name;// 2. 属性public int Age { get; set; }// 3. 构造方法抽象类的构造方法public Person(string name, int age){this.name name;this.Age age;Console.WriteLine(抽象类构造方法执行了);}// 4. 普通方法public void ShowInfo(){Console.WriteLine($姓名{name}年龄{Age});}// 5. 抽象方法public abstract void Work();}- 一个子类只能**继承一个抽象类**单继承// 子类 继承 抽象类单继承只能继承一个class Student : Person{// 子类构造方法调用父类抽象类构造方法public Student(string name, int age): base(name, age){Console.WriteLine(子类构造方法执行了);}- 抽象类可以有构造方法但不能直接调用只能由子类调用。// 必须重写抽象方法public override void Work(){Console.WriteLine(学生的工作是学习);}}class Program{static void Main(){// 抽象类不能 new// Person p new Person(); // 报错// 创建子类对象Student stu new Student(小明, 18);stu.ShowInfo(); // 调用抽象类的普通方法stu.Work(); // 调用重写后的抽象方法}}3. **使用场景**- 定义**通用模板**强制子类必须实现某些功能- 表示**抽象概念**如动物、图形、人不代表具体事物。、、、csharpusing System;// 抽象类表示【图形】这个抽象概念// 不代表具体图形只是所有图形的模板abstract class Shape{// 通用字段所有图形都有颜色public string Color { get; set; }// 通用方法所有图形都能显示颜色public void ShowColor(){Console.WriteLine(颜色 Color);}// 抽象方法强制所有子类必须实现【求面积】public abstract double GetArea();}// 子类圆形具体图形class Circle : Shape{public double Radius { get; set; }// 必须重写抽象方法public override double GetArea(){return Math.PI * Radius * Radius;}}// 子类矩形具体图形class Rectangle : Shape{public double Width { get; set; }public double Height { get; set; }// 必须重写抽象方法public override double GetArea(){return Width * Height;}}class Program{static void Main(){// 抽象类不能 new// Shape s new Shape(); ❌ 报错// 创建子类对象Circle circle new Circle { Radius 5, Color 红色 };Rectangle rect new Rectangle { Width 4, Height 6, Color 蓝色 };// 调用通用方法circle.ShowColor();// 调用子类实现的方法Console.WriteLine(圆形面积 circle.GetArea());rect.ShowColor();Console.WriteLine(矩形面积 rect.GetArea());}}## 二、抽象方法1. **定义**使用 abstract 关键字修饰、**只有方法声明、没有方法体**的方法。2. **核心特点必背**- 没有方法体直接以分号结束- **必须写在抽象类中**- **子类必须重写override所有抽象方法**- 不能使用 private、static 修饰。、、、csharpusing System;// 抽象类抽象方法必须定义在抽象类中abstract class Fruit{// 1. 抽象方法只有声明、无方法体分号结尾public abstract void Taste();// 错误演示1抽象方法不能用 private 修饰// private abstract void Show();// 错误演示2抽象方法不能用 static 修饰// public static abstract void Introduce();}// 子类继承抽象类class Apple : Fruit{// 子类必须使用 override 重写全部抽象方法public override void Taste(){Console.WriteLine(苹果口感清甜);}}class Program{static void Main(){Apple apple new Apple();apple.Taste();Console.ReadKey();}}3. **作用**强制子类必须实现该方法**制定规则、统一规范**、、、csharpusing System;// 抽象父类制定统一规则abstract class Phone{// 抽象方法强制所有子类必须实现拨号功能public abstract void Call();}// 子类1智能手机遵守规则实现方法class SmartPhone : Phone{public override void Call(){Console.WriteLine(智能手机触屏拨号通话);}}// 子类2老年机同样必须实现拨号方法class OldPhone : Phone{public override void Call(){Console.WriteLine(老年机按键拨号通话);}}class Program{static void Main(){Phone p1 new SmartPhone();Phone p2 new OldPhone();p1.Call();p2.Call();Console.ReadKey();}}## 三、抽象类与抽象方法的关系- 有抽象方法的类**必须是抽象类**- 抽象类**可以没有抽象方法**- 子类继承抽象类**必须实现全部抽象方法**否则子类也要变成抽象类。、、、csharpusing System;#region 1. 有抽象方法的类必须声明为抽象类// 包含抽象方法类必须加 abstractabstract class Demo1{public abstract void Test();}#endregion#region 2. 抽象类可以没有抽象方法abstract class Demo2{// 只有普通方法、字段无任何抽象方法public void Show(){Console.WriteLine(抽象类中的普通方法);}}#endregion#region 3. 子类继承抽象类的两种情况// 抽象父类包含抽象方法abstract class Animal{public abstract void Run();public abstract void Eat();}// 情况1非抽象子类 → 必须实现所有抽象方法class Rabbit : Animal{public override void Run(){Console.WriteLine(兔子蹦跳着跑);}public override void Eat(){Console.WriteLine(兔子吃青草);}}// 情况2不实现全部抽象方法 → 子类也必须定义为抽象类abstract class Bird : Animal{// 只重写一个抽象方法另一个不实现类必须加 abstractpublic override void Eat(){Console.WriteLine(小鸟吃虫子);}// 未实现 Run()继承父类的抽象方法}#endregionclass Program{static void Main(){Rabbit rabbit new Rabbit();rabbit.Run();rabbit.Eat();// Bird 是抽象类不能实例化// Bird bird new Bird(); // 编译报错Demo2 d2 new Demo2();d2.Show();Console.ReadKey();}}## 四、重要规则考试必背1. 抽象类 **不能实例化**2. 抽象方法 **没有方法体**3. 抽象方法 **必须在抽象类中**4. 子类继承抽象类**必须重写所有抽象方法**5. 抽象类可以有普通成员、构造方法、静态成员6. 抽象方法不能是 private、static7. 抽象方法必须通过 override 重写。## 五、抽象类 vs 普通类对比记忆1. 抽象类不能实例化普通类可以2. 抽象类可以包含抽象方法普通类不可以3. 抽象类用于被继承、制定规则普通类用于创建对象。markdownusing System;// 1. 抽象类 abstract class Animal{// 抽象方法只有抽象类能拥有public abstract void Cry();// 普通方法public void Show(){Console.WriteLine(我是动物);}}// 2. 普通类 class Person{// 普通类 不能有抽象方法public void SayHi(){Console.WriteLine(我是人类);}}// 子类继承抽象类 class Dog : Animal{// 必须重写抽象方法public override void Cry(){Console.WriteLine(汪汪汪);}}// 主方法测试 class Program{static void Main(){// 1. 抽象类不能实例化普通类可以// Animal a new Animal(); // 报错Person p new Person(); // 正常p.SayHi();// 2. 抽象类用于被继承普通类直接创建对象Dog dog new Dog();dog.Cry();dog.Show();}}## 六、抽象类 vs 接口高频考点1. 抽象类可以有字段、构造方法、实现方法接口不能有字段、构造方法2. 一个类只能继承一个抽象类可以实现多个接口3. 抽象类是 **is a** 关系接口是 **can do** 关系4. 抽象类用 abstract接口用 interface5. 抽象方法必须 override接口方法默认公开直接实现。、、、csharpusing System;// 1. 抽象类 abstract class Animal{// 抽象类【可以有字段】public string name;// 抽象类【可以有构造方法】public Animal(){Console.WriteLine(抽象类构造方法);}// 抽象类【可以有普通实现方法】public void Breath(){Console.WriteLine(所有动物都要呼吸);}// 抽象方法必须 overridepublic abstract void Cry();}// 2. 接口 interface IRunnable{// 接口【不能有字段、不能有构造方法】// 接口只有方法声明默认 publicvoid Run(); // 直接实现不用 override}interface IEatable{void Eat();}// 3. 子类使用 // 一个类【只能继承 1 个抽象类】但【可以实现多个接口】class Dog : Animal, IRunnable, IEatable{// 重写抽象类的抽象方法必须 overridepublic override void Cry(){Console.WriteLine(小狗汪汪叫);}// 实现接口方法直接写不用 overridepublic void Run(){Console.WriteLine(小狗四条腿跑);}public void Eat(){Console.WriteLine(小狗啃骨头);}}// 4. 主方法测试 class Program{static void Main(){Dog dog new Dog();// 抽象类的成员dog.name 旺财;dog.Breath(); // 抽象类的普通方法dog.Cry(); // 重写的抽象方法// 接口的成员dog.Run();dog.Eat();}}## 七、一句话终极记忆**抽象类 不能new、专门当爹、可包含抽象方法****抽象方法 没方法体、子类必须重写、强制制定规则**