一、面向对象编程(OOP)核心思想
面向对象编程是一种以对象为核心的编程范式,它将现实世界中的事物抽象为程序中的对象,每个对象都包含自身的属性(数据)和行为(方法),通过对象之间的交互完成程序功能。其核心优势是提高代码的可复用性、可维护性和可扩展性,这也是 C# 作为面向对象语言的核心价值所在。
二、C# OOP 四大核心特性
1. 封装(Encapsulation)
概念:将对象的属性(字段)和行为(方法)封装在一个类中,隐藏对象内部的实现细节,仅通过公开的接口(公共方法 / 属性)与外部进行交互,同时可以控制对内部数据的访问权限。目的:保护对象的数据不被随意修改,提高代码的安全性和可维护性。C# 实现方式:通过访问修饰符(private/public/protected/internal等)控制成员访问权限,常用private隐藏字段,通过public属性暴露字段的读写操作。
public class User{ private string _userName; private int _age; public string UserName { get { return _userName; } set { _userName = value ?? string.Empty; } } public int Age { get { return _age; } set { if (value > 0) _age = value; else throw new ArgumentOutOfRangeException("年龄必须大于0"); } } public void ShowUserInfo() { Console.WriteLine($"用户名:{UserName},年龄:{Age}"); }}
2. 继承(Inheritance)
概念:允许一个类(子类 / 派生类)继承另一个类(父类 / 基类)的属性和方法,子类可以复用父类的代码,同时可以扩展或重写父类的功能,实现代码复用和层次化设计。C# 关键规则:
- C# 只支持单继承(一个子类只能直接继承一个父类),但支持多层继承和接口多实现。
- 父类中
private成员无法被子类直接访问,protected成员可在子类内部访问。 - 使用
: 关键字实现继承,base关键字可调用父类的构造函数或成员。
public class Person{ public string Name { get; set; } public string Gender { get; set; } public void SayHello() { Console.WriteLine($"大家好,我是{Name}"); }}public class Student : Person{ public string StudentId { get; set; } public string Grade { get; set; } public void Study() { Console.WriteLine($"{Name}正在{Grade}年级学习,学号:{StudentId}"); }}var student = new Student();student.Name = "张三";student.Gender = "男";student.StudentId = "2025001";student.Grade = "高三";student.SayHello(); student.Study();
3. 多态(Polymorphism)
概念:允许同一操作作用于不同的对象,产生不同的执行结果。多态性使得程序具有更好的灵活性和可扩展性,是 OOP 的核心特性之一。C# 实现方式:
- 编译时多态:通过方法重载(Overload)实现(同一类中,方法名相同、参数列表不同(个数 / 类型 / 顺序))。
- 运行时多态:通过方法重写(Override)实现(子类重写父类的虚方法 / 抽象方法,需配合
virtual/abstract/override关键字)。
public class Animal{ public string Name { get; set; } public virtual void MakeSound() { Console.WriteLine("动物发出叫声"); }}public class Dog : Animal{ public override void MakeSound() { Console.WriteLine($"{Name}(狗)汪汪叫"); }}public class Cat : Animal{ public override void MakeSound() { Console.WriteLine($"{Name}(猫)喵喵叫"); }}List<Animal> animalList = new List<Animal>(){ new Dog(){ Name = "旺财" }, new Cat(){ Name = "小白" }, new Animal(){ Name = "通用动物" }};foreach (var animal in animalList){ animal.MakeSound(); }public class Calculator{ public int Add(int a, int b) { return a + b; } public int Add(int a, int b, int c) { return a + b + c; } public double Add(double a, double b) { return a + b; }}
4. 抽象(Abstraction)
概念:忽略对象的非本质细节,只提取和保留与业务相关的核心特征,形成抽象的类或接口。抽象的目的是简化复杂系统,定义统一的规范,让子类去实现具体细节。C# 实现方式:
- 抽象类:使用
abstract关键字声明,不能被实例化,可包含抽象方法(无实现体,需子类强制实现)和非抽象方法(有实现体,可被子类复用)。 - 接口:使用
interface关键字声明,不能被实例化,所有成员都是公共的抽象成员(方法 / 属性 / 事件等,无需abstract关键字),一个类可以实现多个接口。
public abstract class Shape{ public abstract double Area { get; } public void ShowShapeType() { Console.WriteLine($"这是一个{this.GetType().Name},面积为:{Area}"); }}public class Circle : Shape{ public double Radius { get; set; } public override double Area { get { return Math.PI * Radius * Radius; } }}public interface IWorkable{ void Work();}public interface IEatable{ void Eat();}public class Employee : IWorkable, IEatable{ public string EmployeeName { get; set; } public void Work() { Console.WriteLine($"{EmployeeName}正在工作"); } public void Eat() { Console.WriteLine($"{EmployeeName}正在吃饭"); }}
三、C# OOP 关键辅助概念
- 类(Class):对象的模板,定义了对象的属性和方法,是 OOP 的基本单元。
- 对象(Object):类的实例,通过
new关键字创建,是程序运行时的具体实体。 - 字段(Field):类的内部数据,用于存储对象的状态,通常用
private修饰。 - 属性(Property):封装字段的访问接口,提供
get(读取)和set(写入)方法,支持数据验证。 - 方法(Method)
- 构造函数:用于初始化对象的特殊方法,与类名相同,无返回值,可重载,通过
new关键字调用。
四、C# OOP 实际应用场景
场景 1:业务实体建模(封装 + 继承)
在管理系统(如用户管理、订单管理)中,将业务实体抽象为类,通过继承实现实体的层次化。
- 示例:
User(基础用户)→ AdminUser(管理员用户)→ NormalUser(普通用户),管理员用户继承普通用户的基础属性,扩展权限管理方法。
场景 2:组件化开发(多态 + 接口)
在框架开发或模块化系统中,通过接口定义组件规范,不同组件实现接口提供不同功能,实现 “面向接口编程”。
- 示例:日志框架中,定义
ILogger接口(包含Info()/Error()方法),然后实现FileLogger(文件日志)、ConsoleLogger(控制台日志)、DatabaseLogger(数据库日志),业务代码只需依赖ILogger接口,无需关心具体实现,便于切换日志存储方式。
场景 3:通用功能复用(抽象类 + 继承)
对于有公共逻辑但具体细节不同的功能,用抽象类封装公共逻辑,子类实现具体细节,减少重复代码。
- 示例:支付系统中,定义
AbstractPayment抽象类(封装订单校验、金额计算等公共逻辑),子类AlipayPayment、WeChatPayment、UnionPayPayment分别实现各自的支付接口调用逻辑。
场景 4:灵活扩展的业务逻辑(多态)
在需要动态切换业务逻辑的场景中,多态可以让程序无需修改原有代码即可扩展新功能(符合 “开闭原则”)。
- 示例:电商系统的订单支付方式切换,新增支付方式时,只需新增一个支付子类,无需修改原有订单处理逻辑。
阅读原文:原文链接
该文章在 2026/1/19 10:38:20 编辑过