C# 语言入门(五)面向对象、类

📅 2026/7/2 9:58:12
C# 语言入门(五)面向对象、类
本篇核心知识点面向对象三大特性之继承、动态多态虚方法 virtual/override、静态多态函数重载、new 隐藏函数、base 关键字、抽象类 abstract、抽象方法、类构造 / 析构执行顺序、is/as 类型转换、实战动物类案例、游戏植物实战拓展一、继承Inheritance1. 核心概念继承是面向对象三大特性封装、继承、多态之一用于提取多个类的公共属性与方法抽取为父类基类 / Base Class子类派生 / Derived Class直接复用仅编写独有逻辑减少重复代码实现代码复用。类之间语义为「is-a」如向日葵是植物、狗是动物。2. C# 继承硬性规则单继承限制一个类只能有唯一父类不支持 C 多继承、菱形继承可同时实现多个interface接口弥补多继承缺失继承语法class 子类 : 父类无需额外权限修饰符成员继承权限规则public子类、外部全部可访问protected仅本类 子类可访问继承专用修饰符private私有成员无法被子类继承属于类内部私有资源。3. base 关键字核心概念base专门在子类中访问父类资源等价 Java/TSsuperC 无该关键字。三大使用场景子类构造函数调用父类构造子类构造(参数) : base(父参数)子类重写方法内部调用父类同名方法访问父类protected/public成员变量。代码示例植物父类 向日葵子类// 父类通用植物基类 class Plant { protected string name; protected int hp; // 带参构造 public Plant(string n, int h) { name n; hp h; } // 通用受伤害方法虚方法支持重写 public virtual void OnHit() { Console.WriteLine(${name}受到普通伤害); } public void PlayAnim() { Console.WriteLine(播放通用植物动画); } } ​ // 子类向日葵继承Plant class SunFlower : Plant { // 子类构造通过base调用父类构造 public SunFlower(string n, int h) : base(n, h) { } // 子类独有方法 public void CreateSun() { Console.WriteLine(${name}生产阳光); } } ​ // 调用测试 static void Main() { SunFlower sf new SunFlower(向日葵, 100); sf.PlayAnim(); // 继承父类通用方法 sf.CreateSun(); // 子类独有 sf.OnHit(); }4. 构造函数继承规则父类有无参构造时子类实例化自动隐式调用父无参构造父类只有带参构造、无无参构造子类必须使用:base(参数)显式调用否则编译报错执行顺序先父类构造 → 再子类构造析构函数执行顺序相反先子类析构 → 父类析构析构自动调用无法手动调用。5. new 隐藏同名方法概念子类定义与父类同名、同参方法不加override时编译器提示隐藏警告添加new关键字显式声明「该方法与父类无关仅隐藏不重写」无多态效果。特性仅子类变量调用该方法父类变量指向子类对象时仍执行父类原函数。class Plant { public void Show() Console.WriteLine(父类植物信息); } class Nut : Plant { // new 隐藏父类Show无多态 public new void Show() Console.WriteLine(坚果信息); } static void Main() { Plant p new Nut(); p.Show(); // 输出父类方法不会执行子类 }二、多态Polymorphism1. 分类静态多态 动态多态1静态多态编译期确定概念程序编译阶段就确定调用哪个函数代表函数重载、运算符重载。规则同类 / 同作用域函数名相同、参数个数 / 类型 / 顺序不同返回值不参与重载区分。2动态多态运行时确定本节课重点概念程序运行时根据对象真实类型自动匹配子类重写的方法父类引用可统一管理全部子类对象游戏引擎批量更新脚本核心原理。实现必备两个关键字缺一不可父类方法标记virtual标记为虚方法允许子类重写子类同名方法标记override重写覆盖父虚方法动态多态核心规则1 方法名、参数列表、返回值必须完全一致2 父类变量接收子类实例调用虚方法时自动执行子类override逻辑3 仅继承体系、虚方法可实现动态多态。完整实战代码坚果重写受伤害逻辑class Plant { protected string name; protected int hp; public Plant(string n, int h) { name n; hp h; } // 虚方法允许子类重写 public virtual void OnHit() { Console.WriteLine(${name}普通受伤); } } ​ // 坚果子类重写受伤逻辑 class Nut : Plant { public Nut(string n, int h) : base(n, h) { } // override 重写虚方法实现动态多态 public override void OnHit() { if(hp 5000) Console.WriteLine(${name}轻伤动画); else if(hp 2500) Console.WriteLine(${name}重伤动画); else Console.WriteLine(${name}破碎消失); } } ​ static void Main() { // 父类引用指向子类多态生效 Plant plant new Nut(坚果墙, 7500); plant.OnHit(); // 自动执行子类override方法 }2. 多态工程价值游戏引擎中所有脚本继承统一父类MonoBehaviour/Component引擎统一遍历父类数组自动执行每个子类独有的Update()、受伤害逻辑无需大量 if 判断类型。三、抽象类 abstract1. 基础概念使用abstract修饰的类称为抽象类用于定义一套统一规范不能直接 new 实例化仅能作为父类被子类继承。2. 两大核心特性抽象类可以包含普通成员、普通虚方法、抽象方法抽象方法abstract 方法签名;只有声明、无函数体强制非抽象子类必须override实现仅含抽象方法的类必须标记 abstract抽象类可无抽象方法仅限制实例化。3 硬性规则抽象方法不能私有private子类无法重写仅 public/protected若子类继承抽象类但未实现全部抽象方法该子类也必须标记 abstract抽象类无法创建对象只能通过子类实例使用。代码示例抽象动物父类// 抽象动物类定义统一行为规范 abstract class Animal { protected string name; public Animal(string n) { name n; } // 抽象方法无实现子类必须重写 public abstract void Speak(); // 普通通用方法所有动物复用 public void Move() { Console.WriteLine(${name}移动); } } ​ // 狗子类实现抽象Speak class Dog : Animal { public Dog(string n) : base(n) { } public override void Speak() { Console.WriteLine(${name}汪汪); } } ​ static void Main() { // Animal a new Animal(大象); // 报错抽象类不能实例 Animal dog new Dog(旺财); dog.Move(); dog.Speak(); // 执行子类实现的抽象方法 }四、类型判断与转换 is /as1.is关键字概念判断对象是否属于某个类 / 子类返回 bool 布尔值。语法对象 is 类型Plant p new Nut(坚果,7500); if(p is Nut) Console.WriteLine(该对象是坚果子类);2.as安全强制转换概念安全类型转换转换失败返回null不会程序崩溃语法子类类型 变量 父对象 as 子类类型对比普通强转直接(Nut)p转换失败直接抛异常as更安全。Plant p new Nut(坚果,7500); Nut nut p as Nut; if(nut ! null) nut.OnHit();五、构造函数 析构函数完整执行顺序1 构造执行流程从顶层父类 → 子类逐层执行程序执行new 子类()优先调用最高层级父类构造逐层向下依次执行各级父类构造最后执行当前子类构造2 析构执行流程销毁时子类优先1 程序退出 / 对象销毁先执行子类析构2 逐层向上依次调用各级父类析构特性析构函数语法~类名()无参数、无返回值、不能加访问修饰析构自动执行无法手动调用用于释放堆资源、关闭文件 / 网络继承体系下父类析构建议标记virtual防止多态释放内存泄漏。六、继承、多态综合实战abstract class Animal{ protected string name; public Animal(string name) { this.name name; } public abstract void Speak(); public void Move() Console.WriteLine(${name}移动); } ​ class Dog : Animal{ public Dog(string n) : base(n) { } public override void Speak() Console.WriteLine(${name}汪汪); } ​ class Cat : Animal{ public Cat(string n) : base(n) { } public override void Speak() Console.WriteLine(${name}喵喵); } ​ static void Main(){ // 父类数组统一管理所有子类多态批量调用 Animal[] arr { new Dog(旺财), new Cat(汤姆) }; foreach(var ani in arr) { ani.Move(); ani.Speak(); // 自动匹配子类实现 } }七、拓展1 C# 是否支持多继承答类仅单继承可多实现接口2 virtual/override/new 三者区别virtual父类开放重写权限override子类重写虚方法实现多态new仅隐藏父方法无运行多态3 base 三种使用场景子类构造、调用父方法、访问父成员4 抽象类和普通类区别抽象类不能实例、含强制实现抽象方法5 构造 / 析构执行顺序笔试题高频6is判断类型、as安全转换规避强转崩溃7 动态多态运行时生效静态重载编译期生效。