字段封装:私有字段 + 公共属性(如 private string _name; public string Name { get; set; })
方法封装:仅公开必要方法,隐藏内部逻辑(如数据验证)
csharp复制代码
public class BankAccount {
private double _balance; // 私有字段
public void Deposit(double amount) { // 公开方法
if (amount > 0) _balance += amount;
}
}
设计原则
单一职责原则(SRP):一个类只负责一项功能
开闭原则(OCP):对扩展开放,对修改关闭
(2)继承(Inheritance)
核心思想:子类复用父类特性,并扩展新功能。
关键规则
单继承:C# 仅支持单继承(如 class Dog : Animal)
里氏替换原则:子类对象可替代父类对象(如 Animal animal = new Dog();)
构造方法顺序:先执行父类构造方法,再执行子类
成员继承:子类继承父类所有成员(包括私有成员,但不可直接访问)
实现方式
类继承:子类继承父类属性和方法
抽象类与接口
抽象类(abstract):包含未实现方法,需子类重写
接口(interface):纯契约定义,无实现
csharp复制代码
public class Animal {
public virtual void Speak() => Console.WriteLine("Animal sound");
}
public class Dog : Animal {
public override void Speak() => Console.WriteLine("Bark!"); // 重写父类方法
}
禁用继承:用 sealed 修饰类(如 sealed class FinalClass)
(3)多态(Polymorphism)
核心思想:同一操作作用于不同对象时,表现出不同行为。
编译时多态(静态)
方法重载:同名方法不同参数(参数类型/数量不同)
csharp复制代码
public class Calculator {
public int Add(int a, int b) => a + b;
public double Add(double a, double b) => a + b; // 重载
}
复制代码
- 方法隐藏:子类用 `new` 隐藏父类方法(非重写)
csharp复制代码
public class Parent { public void Print() => Console.WriteLine("Parent"); }
public class Child : Parent {
public new void Print() => Console.WriteLine("Child"); // 隐藏父类方法
}
运行时多态(动态)
虚方法重写(virtual + override):
csharp复制代码
Animal animal = new Dog();
animal.Speak(); // 输出 "Bark!"(运行时根据实际对象类型决定)
public class Dog : Animal
{
public override void MakeSound() => Console.WriteLine("Woof!");
}
非抽象成员支持
抽象类可包含字段、属性、构造函数和具体方法:
csharp复制代码
public abstract class Fruit
{
public string Color { get; set; } // 具体属性
public abstract float Price { get; } // 抽象属性
}
构造与继承机制
抽象类可以有构造函数(通常用于初始化公共字段)。
支持多层继承(如 Animal → Mammal → Dog)。
(3)抽象类 vs 接口
特性
抽象类 (abstract class)
接口 (interface)
实现继承
✅ 单继承
✅ 多实现
方法实现
✅ 可含具体方法
❌ 仅方法签名
字段/属性
✅ 可包含字段和属性初始值
❌ 仅自动属性(无字段)
设计目标
表征 IS-A 关系(如狗是动物)
表征 CAN-DO 能力(如可飞行)
决策建议:
需多态且无关类共享行为 → 接口(如日志服务 ILogger)。
存在通用代码需复用 → 抽象类(如游戏实体 GameEntity 基类)。
(4)典型应用场景
框架设计(如游戏角色系统):
csharp复制代码
public abstract class Character {
public int Health { get; set; }
public abstract void Attack(); // 攻击方式由子类定义
public void TakeDamage(int damage) => Health -= damage; // 通用逻辑
}
public class Warrior : Character {
public override void Attack() => Console.WriteLine("Sword slash!");
}
强制规范工具类
csharp复制代码
public abstract class Logger {
public abstract void Log(string message); // 子类必须实现日志写入方式
public void LogError(string error) => Log($"[ERROR] {error}"); // 通用封装
}
️(5)关键注意事项
禁止密封:抽象类不可用 sealed 修饰(否则无法继承)。
构造函数用途:仅用于子类初始化(如 public Dog() : base("Mammal"))。
多态性支持:可通过基类引用调用子类实现(如 Animal a = new Dog(); a.MakeSound();)。
Animal dog = new Dog();
dog.Speak(); // 输出"狗叫:汪汪!"(实际类型决定行为)
调用基类实现:使用base关键字访问被重写的基类方法:
csharp复制代码
public class Car : Vehicle {
public override void Start() {
base.Start(); // 先执行基类启动逻辑
Console.WriteLine("引擎点火"); // 扩展行为
}
}
抽象方法重写:抽象类中声明abstract方法,强制派生类重写:
csharp复制代码
public abstract class Shape {
public abstract void Draw(); // 无实现
}
public class Circle : Shape {
public override void Draw() => Console.WriteLine("绘制圆形"); // 必须实现
}
(3)重写 vs 隐藏
特性
重写(override)
隐藏(new)
基类要求
virtual/abstract方法
任意方法(无需virtual)
多态行为
运行时按实际类型调用派生类方法
编译时按声明类型调用
调用结果
Animal obj = new Dog(); obj.Speak() → 调用Dog.Speak()
Animal obj = new Dog(); obj.Speak() → 调用Animal.Speak()
优先使用重写:确保多态性,避免隐藏导致的逻辑混淆。
️(4)实战应用场景
定制化行为(如不同动物叫声)
csharp复制代码
public class Cat : Animal {
public override void Speak() => Console.WriteLine("猫叫:喵喵!");
}
扩展基类功能(如车辆启动流程增强)
csharp复制代码
public class ElectricCar : Car {
public override void Start() {
base.Start(); // 保留基类启动逻辑
Console.WriteLine("电池系统激活"); // 新增步骤
}
}
实现设计模式(如模板方法模式)
csharp复制代码
public abstract class GameAI {
public void Turn() {
CollectResources();
BuildStructures(); // 可重写的步骤
}
protected virtual void BuildStructures() { } // 默认空实现
}
public class OrcAI : GameAI {
protected override void BuildStructures() => Console.WriteLine("建造兽人兵营");
}
(5)关键注意事项
访问权限:重写方法访问级别需与基类一致(如public重写public)。
异常处理:重写方法抛出的异常类型必须与基类相同或是其子类。
性能优化:避免深度继承链中频繁重写,可能导致调用栈过深。
调试技巧:使用base调试基类逻辑,用this验证派生类行为,结合断点观察多态调用链。
7、命名空间
(1)核心作用
解决命名冲突
将全局作用域划分为独立区块,避免不同库中同名类型/函数冲突。
使用时通过完整限定名区分:CompanyA.Project.Logger vs CompanyB.Project.Logger。
csharp复制代码
namespace CompanyA.Project { class Logger { } }
namespace CompanyB.Project { class Logger { } }