C# 继承(Inheritance)详解

C# 继承(Inheritance)详解
继承Inheritance是 C# 面向对象编程OOP的核心特性之一它允许一个类获得另一个类的成员字段、属性、方法等从而实现代码复用并建立类之间的层次关系。简单理解子类派生类继承父类基类的特征并可以扩展或修改这些特征。例如动物 → 狗交通工具 → 汽车员工 → 程序员这些关系都符合狗是一种动物汽车是一种交通工具程序员是一种员工在 C# 中通常称为is-a 关系。1. 基本语法C# 使用冒号:表示继承。语法class 子类 : 父类 { }例如// 父类 class Animal { public string Name; public void Eat() { Console.WriteLine(动物吃东西); } } // 子类继承 Animal class Dog : Animal { }使用Dog dog new Dog(); dog.Name 旺财; dog.Eat();输出动物吃东西虽然Dog没有定义Eat()方法但是继承了Animal的方法。2. 继承获得什么子类可以继承父类成员是否继承public 字段✅public 属性✅public 方法✅protected 成员✅private 成员❌构造函数❌析构函数❌例如class Person { public string Name; protected int Age; private string Password; public void Speak() { Console.WriteLine(说话); } } class Student : Person { }Student可以访问Name; Age; Speak();不能访问Password;3. 父类和子类关系例如class Animal { public void Eat() { Console.WriteLine(吃东西); } } class Cat : Animal { public void CatchMouse() { Console.WriteLine(抓老鼠); } }调用Cat cat new Cat(); cat.Eat(); cat.CatchMouse();输出吃东西 抓老鼠结构Animal | | CatCat 拥有Eat() CatchMouse()4. 子类扩展父类功能继承最大的作用在已有功能基础上增加新功能。例如class Employee { public string Name; public void Work() { Console.WriteLine(工作); } } class Programmer : Employee { public void WriteCode() { Console.WriteLine(写代码); } }使用Programmer p new Programmer(); p.Name 张三; p.Work(); p.WriteCode();输出工作 写代码5. 方法重写override继承后有时候子类需要改变父类的方法行为。这叫方法重写Override父类class Animal { public virtual void Sound() { Console.WriteLine(动物叫); } }注意virtual表示这个方法允许子类修改。子类class Dog : Animal { public override void Sound() { Console.WriteLine(汪汪叫); } }调用Animal a new Dog(); a.Sound();输出汪汪叫6. virtual 和 override继承中常见组合父类public virtual 方法()允许修改。子类public override 方法()重新实现。例如class Shape { public virtual void Draw() { Console.WriteLine(画图形); } } class Circle : Shape { public override void Draw() { Console.WriteLine(画圆); } }7. base 关键字base表示调用父类成员例如class Animal { public void Eat() { Console.WriteLine(吃东西); } } class Dog : Animal { public void Eat() { base.Eat(); Console.WriteLine(狗吃骨头); } }调用Dog d new Dog(); d.Eat();输出吃东西 狗吃骨头8. 调用父类构造函数子类对象创建时一定会先调用父类构造函数。例如class Person { public Person() { Console.WriteLine(Person构造); } } class Student : Person { public Student() { Console.WriteLine(Student构造); } }执行Student s new Student();输出Person构造 Student构造顺序父类构造 ↓ 子类构造9. 使用 base 调父类构造父类class Person { public Person(string name) { Console.WriteLine(name); } }子类class Student : Person { public Student() : base(学生) { } }执行Student s new Student();输出学生10. C# 不支持多继承C#❌ 不允许class Dog : Animal, Pet { }一个类只能继承一个父类。但是支持多个接口✅class Dog : Animal, IRunnable, IFlyable { }结构Animal | Dog / \ IRunnable IFlyable11. sealed 禁止继承如果不希望别人继承你的类使用sealed例如sealed class MathHelper { }下面会报错class MyMath : MathHelper { }错误无法从密封类型继承12. 抽象类继承抽象类不能直接创建对象。例如abstract class Animal { public abstract void Sound(); }子类必须实现class Dog : Animal { public override void Sound() { Console.WriteLine(汪汪); } }使用Animal a new Dog(); a.Sound();13. 继承与多态继承是多态的基础。例如class Animal { public virtual void Speak() { Console.WriteLine(动物声音); } } class Dog : Animal { public override void Speak() { Console.WriteLine(汪汪); } } class Cat : Animal { public override void Speak() { Console.WriteLine(喵喵); } }统一调用Animal[] animals { new Dog(), new Cat() }; foreach(Animal a in animals) { a.Speak(); }输出汪汪 喵喵这就是父类引用指向不同子类对象。14. 类型转换向上转换自动子类 → 父类安全Dog dog new Dog(); Animal animal dog;向下转换需要强制父类 → 子类Animal animal new Dog(); Dog dog (Dog)animal;15. is 判断类型if(animal is Dog) { Console.WriteLine(这是狗); }16. as 转换Dog dog animal as Dog; if(dog ! null) { dog.Sound(); }17. 继承实际案例例如游戏开发父类class Character { public int HP; public virtual void Attack() { Console.WriteLine(攻击); } }战士class Warrior : Character { public override void Attack() { Console.WriteLine(挥剑攻击); } }法师class Mage : Character { public override void Attack() { Console.WriteLine(释放魔法); } }调用Character c1 new Warrior(); Character c2 new Mage(); c1.Attack(); c2.Attack();输出挥剑攻击 释放魔法18. 继承设计原则适合继承例如动物 | 狗因为狗 是 动物不适合继承例如汽车 | 发动机因为发动机不是汽车这种应该使用组合class Car { Engine engine; }19. 继承 vs 组合特点继承组合关系is-ahas-a代码复用高高耦合强弱灵活性低高推荐程度谨慎使用优先考虑现代 C# 开发中优先组合谨慎继承。20. C# 继承核心总结关键字作用:表示继承virtual允许重写override重写父类方法base访问父类abstract抽象类/抽象方法sealed禁止继承protected给子类访问is类型判断as安全转换一句话总结C# 继承让子类复用父类代码并通过 virtual override 实现多态是面向对象设计中实现扩展和复用的重要机制。继承通常和封装、抽象、多态一起构成 C# 面向对象编程的四大核心思想。