差别
这里会显示出您选择的修订版和当前版本之间的差别。
| 后一修订版 | 前一修订版 | ||
| csharp:类:类的继承 [2025/09/28 16:41] – 创建 张叶安 | csharp:类:类的继承 [2025/11/27 10:06] (当前版本) – 张叶安 | ||
|---|---|---|---|
| 行 1: | 行 1: | ||
| - | 90-10:类的继承 | + | ====== |
| - | {{.: | + | 类的继承是面向对象编程 (OOP) 的三大特性之一(封装、继承、多态)。它允许我们定义一个类(子类/ |
| - | 格式:Class 类名1 : 类名2 {} | + | ===== 1. 基本语法与概念 ===== |
| - | PS: | + | |
| - | 继承的本质它就是类、只不过它含父类里面的成员、 | + | |
| + | 在 C# 中,继承使用冒号 ``:`` 符号。 | ||
| + | |||
| + | **格式:** | ||
| + | <code csharp> | ||
| + | class 子类名 : 父类名 | ||
| + | { | ||
| + | // 子类特有的成员 | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | **核心规则:** | ||
| + | * | ||
| + | * | ||
| + | * | ||
| + | |||
| + | ===== 2. 基础实例分析 ===== | ||
| + | |||
| + | 以下代码展示了如何通过继承共享属性 ``A``,同时子类各自拥有独立的成员。 | ||
| + | |||
| + | <code csharp> | ||
| + | using System; | ||
| + | |||
| + | namespace InheritanceDemo | ||
| + | { | ||
| class Program | class Program | ||
| { | { | ||
| static void Main(string[] args) | static void Main(string[] args) | ||
| { | { | ||
| - | wlala hei = new wlala(); // | + | |
| - | Bsei kar = new Bsei(); //实例化类3的对象 kar | + | |
| - | hei.A = 69;//相同的属性 | + | |
| - | kar.A = 32; | + | |
| - | hei.beis(); //执行类2的方法 | + | Bsei kar = new Bsei(); |
| + | |||
| + | | ||
| + | hei.A = 69; // wlala 本身没有定义 A,是继承来的 | ||
| + | kar.A = 32; // Bsei 同理 | ||
| + | |||
| + | // 4. 执行子类特有的方法 | ||
| + | hei.beis(); // 输出: 69 | ||
| + | |||
| + | // kar.beis(); // 报错:Bsei | ||
| } | } | ||
| } | } | ||
| - | class wlala: FB1 // | + | |
| - | // | + | // |
| + | class FB1 | ||
| { | { | ||
| - | public int B { get; set ; }//超级简化定义属性 | + | |
| - | public void beis() //创建类2的方法 | + | public int A { get; set; } |
| + | } | ||
| + | |||
| + | // ==== 子类 1 ==== | ||
| + | // wlala 继承了 FB1,所以它拥有 A | ||
| + | class wlala : FB1 | ||
| + | { | ||
| + | | ||
| + | |||
| + | public void beis() // 子类特有的方法 | ||
| { | { | ||
| - | Console.WriteLine(" | + | |
| + | | ||
| } | } | ||
| } | } | ||
| + | |||
| + | // ==== 子类 2 ==== | ||
| class Bsei : FB1 | class Bsei : FB1 | ||
| { | { | ||
| public int C { get; set; } | public int C { get; set; } | ||
| } | } | ||
| - | class FB1 | + | } |
| - | { | + | </ |
| - | public int A { get; set; } | + | |
| - | } | + | |
| + | ===== 3. 继承的核心思想与多态 ===== | ||
| + | 继承不仅仅是为了少写代码,更重要的是为了实现**多态 (Polymorphism)** 和**里氏替换原则 (LSP)**。 | ||
| + | ==== 3.1 核心思想 1:复用 ==== | ||
| + | * | ||
| + | ==== 3.2 核心思想 2:多态与里氏替换 ==== | ||
| + | * | ||
| + | * | ||
| + | **代码修正与深度解析:** | ||
| + | 原笔记中的 ``public void shengcan(); | ||
| + | 以下是修正后的**工厂模式/ | ||
| + | <code csharp> | ||
| + | using System; | ||
| - | ①-1:继承的核心思想 | + | namespace FactoryPatternDemo |
| - | 1: | + | { |
| - | 2: | + | class Program |
| - | | + | { |
| - | 例如: | + | static void Main(string[] args) |
| - | static void Main(string[] args) | + | |
| { | { | ||
| - | | + | |
| - | nb = new Lenovo(); | + | NoteBook |
| - | //nb = new IBM(); | + | |
| - | | + | // 【多态的核心】:父类变量指向子类对象 |
| - | //nb = new DeLL(); | + | // 无论 new 出来的是 Lenovo 还是 IBM,它们都是 NoteBook |
| + | |||
| + | | ||
| + | | ||
| + | |||
| + | | ||
| + | nb.ShengCan(); // 调用的是 IBM 的生产逻辑 | ||
| + | | ||
| + | // 实际应用中,这里通常配合简单工厂模式: | ||
| + | // NoteBook myComputer | ||
| } | } | ||
| + | } | ||
| - | | + | |
| - | { | + | // 只有具体的品牌才能生产。 |
| - | public void shengcan(); | + | public |
| - | } | + | |
| - | //以下类继承了NotBook 父类 | + | |
| - | public class Lenovo : NotBook | + | |
| { | { | ||
| + | // 抽象方法:强制子类必须实现这个方法 | ||
| + | public abstract void ShengCan(); | ||
| } | } | ||
| - | | + | |
| + | // 以下类继承了 NoteBook 父类 | ||
| + | | ||
| { | { | ||
| + | public override void ShengCan() | ||
| + | { | ||
| + | Console.WriteLine(" | ||
| + | } | ||
| } | } | ||
| - | | + | |
| + | | ||
| { | { | ||
| + | public override void ShengCan() | ||
| + | { | ||
| + | Console.WriteLine(" | ||
| + | } | ||
| } | } | ||
| - | | + | |
| + | | ||
| { | { | ||
| + | public override void ShengCan() | ||
| + | { | ||
| + | Console.WriteLine(" | ||
| + | } | ||
| } | } | ||
| + | public class DeLL : NoteBook | ||
| + | { | ||
| + | public override void ShengCan() | ||
| + | { | ||
| + | Console.WriteLine(" | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | ===== 4. 知识点扩展 (Deep Dive) ===== | ||
| + | 为了更深入理解继承,需要注意以下几点: | ||
| + | - **访问修饰符 (Access Modifiers):** | ||
| + | * | ||
| + | * | ||
| + | * | ||
| + | - **构造函数 (Constructors):** | ||
| + | * | ||
| + | * | ||
| + | * | ||
| - | + | - **Object 类:** | |
| - | + | | |
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||