C# 抽象类、接口、多态、单向链表 完整讲解 + 代码示例 📅 2026/6/24 4:17:32 一、抽象类 abstract class1. 核心特点用abstract修饰不能实例化只能被继承可包含普通字段、普通方法、抽象方法无方法体、构造函数、属性派生类必须重写所有抽象成员用override单继承一个类只能继承一个抽象类有构造函数子类实例化时会先执行父抽象类构造示例代码csharp运行// 抽象动物父类 abstract class Animal { public string Name { get; set; } // 普通构造 public Animal(string name) { Name name; } // 抽象方法无实现子类必须重写 public abstract void Speak(); // 普通方法已有实现子类可重写可不重写 public void Run() { Console.WriteLine(${Name} 在奔跑); } } // 子类继承抽象类重写抽象方法 class Dog : Animal { public Dog(string name) : base(name) { } public override void Speak() { Console.WriteLine(${Name}汪汪汪); } } class Cat : Animal { public Cat(string name) : base(name) { } public override void Speak() { Console.WriteLine(${Name}喵喵喵); } }二、接口 interface1. 核心特点关键字interface不能实例化、无构造函数只能包含方法、属性、事件、索引器不能有字段、普通变量默认所有成员都是public不能加访问修饰符一个类可实现多个接口解决单继承局限接口成员必须全部实现用public重写C#8.0 接口可以写默认实现方法示例代码csharp运行// 会叫的接口 interface ISpeak { void Speak(); } // 会飞的接口 interface IFly { void Fly(); } // 鸟类同时实现两个接口 class Bird : ISpeak, IFly { public void Speak() { Console.WriteLine(叽叽叽); } public void Fly() { Console.WriteLine(小鸟展翅飞翔); } }抽象类 vs 接口对比表格特性抽象类 abstract接口 interface继承 / 实现单继承多实现字段可以有成员变量不能有字段构造函数有无访问修饰可 private/protected/public只能 public使用场景提取子类公共代码、有共同属性行为定义一套行为规范多类不相关也可实现三、多态 Polymorphism1. 两种多态编译时多态静态方法重载 Overload同一个类同名不同参数运行时多态动态核心方法重写 Override父类引用指向子类对象动态多态核心规则父类变量 new 子类 ();调用虚 / 抽象方法时执行子类重写后的逻辑多态完整演示结合上面抽象类csharp运行class Program { static void Main() { // 父类引用指向不同子类多态体现 Animal a1 new Dog(旺财); Animal a2 new Cat(橘猫); TestSpeak(a1); TestSpeak(a2); } // 统一接收父类自动执行子类方法 static void TestSpeak(Animal animal) { animal.Speak(); animal.Run(); } }输出plaintext旺财汪汪汪 旺财 在奔跑 橘猫喵喵喵 橘猫 在奔跑四、单向链表手写基础链表链表核心节点 Node 链表管理类节点存储数据 下一个节点地址链表记录头节点提供增删改查完整单向链表代码csharp运行// 链表节点 class NodeT { public T Data; // 存储数据 public NodeT Next; // 指向下一个节点 public Node(T data) { Data data; Next null; } } // 泛型单向链表 class SingleLinkListT { private NodeT head; // 头节点 public int Count { get; private set; } // 节点数量 // 尾部添加 public void Add(T data) { NodeT newNode new NodeT(data); if (head null) { head newNode; } else { NodeT temp head; while (temp.Next ! null) { temp temp.Next; } temp.Next newNode; } Count; } // 遍历打印所有元素 public void Show() { if (head null) { Console.WriteLine(链表为空); return; } NodeT temp head; while (temp ! null) { Console.Write(temp.Data ); temp temp.Next; } Console.WriteLine(); } // 根据值删除第一个匹配节点 public void Remove(T data) { if (head null) return; // 头节点就是目标 if (head.Data.Equals(data)) { head head.Next; Count--; return; } NodeT temp head; // 找到待删节点的前一个 while (temp.Next ! null !temp.Next.Data.Equals(data)) { temp temp.Next; } if (temp.Next null) return; temp.Next temp.Next.Next; Count--; } } // 测试 class Program { static void Main() { SingleLinkListint list new SingleLinkListint(); list.Add(10); list.Add(20); list.Add(30); list.Show(); // 10 20 30 list.Remove(20); list.Show(); // 10 30 Console.WriteLine(节点总数 list.Count); } }五、综合拓展接口 多态 链表结合思路定义IData接口规范数据行为多个实体类实现接口链表存储接口类型实现多态存放不同对象遍历链表时自动调用各自重写的方法