小白学习C#笔记 day4 - 继承进阶:protected访问修饰符与多态基础 📅 2026/7/18 4:40:20 ⭐以下内容可能有误请仔细甄别1.protected访问修饰符我们之前学了两种访问权限• public完全公开任何地方都能读写• private完全私有只有当前类内部能用在继承场景里会出现一个中间需求父类的成员只想让子类能直接访问不想对外界公开。private太严子类也碰不到public太松外部随便改C#专门为这个场景设计了protected。权限范围当前类内部 所有派生类内部可访问类外部代码无法访问核心作用在继承体系内权限权限对外依然保持封装性举例如下另外补充一个高频用法属性的访问器也可以单独加protected比如public string Name { get;protected set;}效果是外界可以读取名字但只有类内部和子类可以修改名字比private set多了子类修改的权限。下面介绍三个典型常用的场景1.基类核心状态字段子类内部需直接操作对外严格封装最常见于游戏开发、业务模型的基类设计。• 场景比如角色基类 Character 里的 _hp、_attack 等核心数值战士、法师等子类的专属技能方法里需要频繁读写这些值但绝对不允许外部代码直接修改。• 为什么不用 private子类碰不到只能通过公开属性间接操作子类内部写逻辑会很繁琐• 为什么不用 public外部随便改数值直接破坏封装和业务规则。2.基类内部通用方法仅供给子类复用对外隐藏实现• 场景基类封装了通用的计算逻辑比如伤害公式、属性校验方法所有子类都要调用但这个内部方法不该暴露给外部使用者。• 作用通用逻辑只写一遍子类直接复用同时对外隐藏内部实现细节。你可以把父类想象成「后厨总厨房」子类是「各个特色档口川菜、粤菜」外部代码是「吃饭的客人」。• 厨房里有个通用技能切菜备料()这个活儿每个档口都要做但绝对不能让客人自己上手。• 如果设成 private只有总厨房自己能用各个档口子类用不了每个档口都得重新学一遍切菜重复劳动• 如果设成 public客人也能直接进后厨切菜完全乱套破坏封装• 设成 protected 刚好所有后厨内部的档口子类都能用客人外部代码碰不到。对应到代码里3.属性的 protected set—— 日常开发最高频用法• 场景属性对外只读但允许子类内部修改。比如角色等级、学生的学籍状态外部只能查看子类的升级、转职方法可以修改。• 对比private set 只有当前类能改protected set 是当前类 所有子类都能改权限更贴合继承体系。举个生活例子学生的学籍状态对外只能查看公开读只有教务处父类和班主任子类能修改普通同学外部代码改不了这时候就适合用 protected set。2.多态一、什么是多态通俗定义同一个行为不同对象有不一样的实现效果。游戏场景举例所有角色都有「释放技能」这个行为但战士、法师、弓箭手的技能完全不同。• 父类角色统一规定“释放技能”这个动作• 子类战士重写技能近战挥砍• 子类法师重写技能远程火球• 子类弓箭手重写技能射箭同一个方法名CastSkill()不同角色调用效果不一样这就是多态。二、实现多态的基础语法virtual override1. virtual写在父类方法前面代表这个方法允许子类重写2. override写在子类方法前面代表重写父类标记virtual的方法示例如下三、多态真正的核心用法父类变量接收子类对象这是多态最关键的价值也是游戏开发高频写法父类类型的变量可以存放任意一个它的子类实例。核心好处你不需要单独创建战士数组、法师数组只用一个Character数组就能管理所有类型角色一套代码统一调用技能新增职业只需要新建子类不用改动原有逻辑。四、补充base.方法() 在重写里的作用重写时如果想保留父类原本的逻辑再追加子类专属效果用base.CastSkill()调用父类原方法五、硬性规则必记1. 父类不加virtual子类绝对不能用override重写2. 重写的方法方法名、返回值、参数列表必须和父类完全一致3. 访问权限不能变父类是public子类重写也必须public前天晚上起来拉肚子没睡好昨天下午休息少学了会