差别
这里会显示出您选择的修订版和当前版本之间的差别。
| 后一修订版 | 前一修订版 | ||
| csharp:类:抽象类 [2025/09/28 16:44] – 创建 张叶安 | csharp:类:抽象类 [2025/11/27 10:08] (当前版本) – [1. 核心概念与简介] 张叶安 | ||
|---|---|---|---|
| 行 1: | 行 1: | ||
| - | 90-20:抽象类abstract | + | ====== |
| - | 90-20-1:抽象类简介 | + | 抽象类是 C# 面向对象编程中用于构建**类层次结构**的重要工具。它位于“普通类”和“接口”之间,既可以定义行为的标准(抽象方法),也可以提供通用的实现(普通方法)。 |
| - | 抽象类是一种独特的类,它不能被直接实例化。 | + | ===== 1. 核心概念与简介 ===== |
| - | 抽象类主要用来作为其他类的基类,定义一些通用的属性或方法, | + | 抽象类是一种**不能被实例化**的类,它的主要作用是作为其他类的**基类 |
| - | 然后由子类根据具体需求来改写抽象类里的方法。 | + | * |
| + | * | ||
| + | * | ||
| - | 方法体不需要---意味着花括号不用写 | + | ===== 2. 抽象方法 |
| - | 注意抽象方法只能在抽象类里面使用 | + | 抽象方法是抽象类的核心特征。 |
| - | 例如: | + | * |
| - | ``` | + | |
| - | abstract class max //抽象类 | + | * |
| + | * | ||
| + | * | ||
| + | * | ||
| + | |||
| + | <code csharp> | ||
| + | // 格式示例 | ||
| + | abstract class Max // 抽象类 | ||
| { | { | ||
| - | public abstract void run();// | + | // 抽象方法:只有定义,没有实现 |
| + | | ||
| } | } | ||
| - | ``` | + | </ |
| - | 当其他类对象继承它时、需要重新写该方法[抽象方法] | + | ===== 3. 案例分析与代码详解 ===== |
| - | 虽然抽象类不能被直接实例化、但它可以定义字段和类型,这些字段和类型可以用于引用非抽象的派生类的实例对象 | + | 以下代码展示了如何定义抽象类,以及如何在子类中实现它,并利用多态性进行调用。 |
| - | 总结:抽象类中定义的抽象方法、没有实现、相当于只是定义了一个框架而已、 | + | <code csharp> |
| + | using System; | ||
| - | 那个类要用这个框架[就继承于它、需要重新写该方法] | + | namespace AbstractDemo |
| - | + | ||
| - | # 抽象类案例1 | + | |
| - | + | ||
| - | ``` | + | |
| - | class Program | + | |
| { | { | ||
| + | class Program | ||
| + | { | ||
| static void Main(string[] args) | static void Main(string[] args) | ||
| { | { | ||
| - | Test test = new Test();// | + | |
| - | test.fangfa1(); | + | // 抽象类不能 new,但子类可以 |
| + | | ||
| + | test.Fangfa1(); // 调用子类重写后的方法 | ||
| - | | + | // 2. 抽象类的多态性 (核心知识点) |
| - | test2.fangfa1(); | + | // 虽然不能 new Chouxiang_class(),但可以声明该类型的变量 |
| - | test2.num = 4; | + | |
| + | Chouxiang_class test2 = test; | ||
| + | | ||
| + | test2.Fangfa1(); // 依然调用的是 Test 类中重写的逻辑 | ||
| + | test2.num = 4; // 访问抽象类中定义的公共字段 | ||
| + | |||
| + | Console.WriteLine($" | ||
| } | } | ||
| - | } | + | |
| - | //抽象类 | + | // ==== 抽象类 |
| + | // 定义框架 | ||
| abstract class Chouxiang_class | abstract class Chouxiang_class | ||
| { | { | ||
| - | | + | // 1. 抽象方法:强制子类必须实现 |
| + | // 注意:没有方法体 {} | ||
| + | | ||
| + | |||
| + | // 2. 普通字段:子类直接继承使用 | ||
| public int num; | public int num; | ||
| + | |||
| + | // 3. 普通方法:抽象类也可以包含已实现的方法 | ||
| + | public void CommonMethod() | ||
| + | { | ||
| + | Console.WriteLine(" | ||
| + | } | ||
| } | } | ||
| - | //子类[使用继承] | + | // ==== 子类 |
| + | // 继承抽象类 | ||
| class Test : Chouxiang_class | class Test : Chouxiang_class | ||
| { | { | ||
| - | | + | // 必须使用 override 关键字重写父类的抽象方法 |
| + | public override void Fangfa1() | ||
| { | { | ||
| - | Console.WriteLine(" | + | Console.WriteLine(" |
| } | } | ||
| } | } | ||
| - | ``` | + | } |
| + | </ | ||
| + | |||
| + | ===== 4. 深度解析:为什么要用抽象类? ===== | ||
| + | |||
| + | 很多初学者会问:“为什么不直接写个普通父类,或者直接写个子类,非要搞个抽象类?” | ||
| + | |||
| + | - **强制性 (Enforcement):** | ||
| + | 如果你用普通父类定义一个空方法让子类去重写,子类可能会**忘记**重写。但使用 | ||
| + | |||
| + | - **代码复用 (Code Reuse):** | ||
| + | 抽象类不仅仅只有抽象方法,它还可以包含**普通方法**和**字段**(如上面的 ``num`` 字段)。这允许把所有子类共有的逻辑(比如日志记录、ID属性)放在父类中,避免重复代码。 | ||
| + | |||
| + | - **多态 (Polymorphism):** | ||
| + | 如案例中的 ``Chouxiang_class test2 = test; | ||
| + | |||
| + | ===== 5. 易错点总结 ===== | ||
| + | * | ||
| + | * | ||
| + | * | ||
| + | * | ||
| + | * | ||
| + | * | ||
| + | * | ||
| + | * | ||