当前位置: 首页 > news >正文

第四章:C# 面向对象编程详解:从类与对象到完整项目实践

C# 面向对象编程详解:从类与对象到完整项目实践

4.1 类(Class)与对象(Object)的概念

核心概念解析

类(Class) 是面向对象编程的蓝图或模板,它定义了:

  • 数据成员:字段和属性,用于存储对象状态

  • 行为成员:方法,定义对象能执行的操作

  • 构造机制:构造函数,用于创建和初始化对象

对象(Object) 是类的具体实例,是根据类定义创建的现实实体。

类与对象关系流程图

类与对象关系流程图

现实世界类比

// 类:就像汽车的设计图纸
class Car
{// 属性:颜色、品牌、速度等public string Color { get; set; }public string Brand { get; set; }// 方法:启动、加速、刹车等public void Start() { /* 启动逻辑 */ }public void Accelerate() { /* 加速逻辑 */ }
}// 对象:就像根据图纸制造的具体汽车
Car myCar = new Car();      // 我的汽车
Car yourCar = new Car();    // 你的汽车

第一个完整的类示例

using System;// 定义一个Person类
class Person
{// 字段 - 存储数据public string name;public int age;// 方法 - 定义行为public void Introduce(){Console.WriteLine($"你好,我叫{name},今年{age}岁。");}
}class Program
{static void Main(){// 创建Person类的对象(实例化)Person person1 = new Person();person1.name = "张三";person1.age = 25;person1.Introduce();  // 输出:你好,我叫张三,今年25岁。Person person2 = new Person();person2.name = "李四";person2.age = 30;person2.Introduce();  // 输出:你好,我叫李四,今年30岁。}
}

4.2 字段(Field)与属性(Property)

字段(Field)

字段是直接在类中声明的变量,用于存储对象的状态数据。

class Student
{// 公共字段 - 通常使用小写字母开头public string name;public int age;// 私有字段 - 只能在类内部访问private double gpa;// 静态字段 - 属于类本身,所有实例共享private static int studentCount = 0;
}

属性(Property)

属性提供了对字段的安全访问机制,可以添加验证逻辑。

属性访问流程图

属性访问流程图

完整属性(Full Property)
class BankAccount
{private double balance;  // 私有字段// 属性 - 提供对balance字段的受控访问public double Balance{get { return balance; }  // 读取值set { // 添加验证逻辑if (value >= 0)balance = value;elseConsole.WriteLine("余额不能为负数!");}}private string accountNumber;// 只读属性public string AccountNumber{get { return accountNumber; }}
}
自动属性(Auto Property)

当不需要额外逻辑时,可以使用简洁的自动属性:

class Product
{// 自动属性 - 编译器自动生成私有字段public string Name { get; set; }public decimal Price { get; set; }public int Stock { get; set; }// 只读自动属性(只能在构造函数中设置)public string Category { get; }// 带有不同访问级别的属性public string InternalCode { get; private set; }
}

字段与属性的使用场景对比

class Employee
{// 字段 - 用于内部计算,不需要外部访问private DateTime hireDate;private int workingYears;// 属性 - 需要验证或计算的公共数据private string _name;public string Name{get { return _name; }set { if (!string.IsNullOrWhiteSpace(value))_name = value.Trim();elsethrow new ArgumentException("姓名不能为空");}}// 计算属性(只有getter)public bool IsEligibleForPromotion{get { return workingYears >= 3; }}// 自动属性public string Department { get; set; }
}

4.3 方法(Method)

方法的基本定义

方法是类中定义行为的方式,包含执行特定任务的语句块。

class Calculator
{// 无参数无返回值的方法public void ShowWelcome(){Console.WriteLine("欢迎使用计算器!");}// 有参数无返回值的方法public void PrintMessage(string message){Console.WriteLine($"消息:{message}");}// 有参数有返回值的方法public int Add(int a, int b){return a + b;}// 多个参数的方法public double CalculateBMI(double weight, double height){return weight / (height * height);}
}

方法调用执行流程图

方法调用执行流程图

方法重载(Overload)

同一个类中可以有多个同名方法,只要参数列表不同:

class MathOperations
{// 整数相加public int Add(int a, int b){return a + b;}// 浮点数相加 - 参数类型不同public double Add(double a, double b){return a + b;}// 三个数相加 - 参数数量不同public int Add(int a, int b, int c){return a + b + c;}
}

方法重载解析流程图

方法重载解析流程图

参数传递方式

class ParameterDemo
{// 值传递 - 传递参数的副本public void IncrementValue(int number){number++;Console.WriteLine($"方法内: {number}");}// 引用传递 - 使用ref关键字public void IncrementRef(ref int number){number++;Console.WriteLine($"方法内: {number}");}// 输出参数 - 使用out关键字public void GetUserInfo(out string name, out int age){name = "张三";  // 必须赋值age = 25;      // 必须赋值}
}

4.4 构造函数与析构函数

构造函数(Constructor)

构造函数在创建对象时自动调用,用于初始化对象。

class Book
{public string Title { get; set; }public string Author { get; set; }public decimal Price { get; set; }// 默认构造函数public Book(){Title = "未知";Author = "未知";Price = 0;}// 参数化构造函数public Book(string title, string author, decimal price){Title = title;Author = author;Price = price;}// 构造函数重载public Book(string title, string author) : this(title, author, 0){// 使用this调用其他构造函数}
}

对象生命周期流程图

对象生命周期流程图

静态构造函数

静态构造函数用于初始化类的静态成员。

class Configuration
{public static string DatabaseConnection { get; private set; }public static DateTime InitializeTime { get; private set; }// 静态构造函数static Configuration(){DatabaseConnection = "Server=localhost;Database=MyApp;";InitializeTime = DateTime.Now;}
}

析构函数

class ResourceManager
{private string resourceName;public ResourceManager(string name){resourceName = name;}// 析构函数~ResourceManager(){Console.WriteLine($"资源 '{resourceName}' 正在被清理");// 释放非托管资源}
}

注意:在现代C#中,通常使用 IDisposable 接口而不是析构函数来管理资源。


4.5 📝 动手练习

练习1:银行账户类

class BankAccount
{public string AccountNumber { get; }public string Owner { get; set; }public decimal Balance { get; private set; }// 静态字段private static int accountCount = 0;public BankAccount(string owner, decimal initialBalance = 0){AccountNumber = GenerateAccountNumber();Owner = owner;Balance = initialBalance;accountCount++;}public void Deposit(decimal amount){if (amount <= 0){Console.WriteLine("存款金额必须大于0");return;}Balance += amount;Console.WriteLine($"成功存款 {amount:C},当前余额: {Balance:C}");}public void DisplayInfo(){Console.WriteLine("=== 账户信息 ===");Console.WriteLine($"账号: {AccountNumber}");Console.WriteLine($"户主: {Owner}");Console.WriteLine($"余额: {Balance:C}");}private string GenerateAccountNumber(){return "ACC" + DateTime.Now.ToString("yyyyMMddHHmmss");}
}

银行账户操作流程图

银行账户操作流程图

练习2:学生成绩管理系统学生类

class Student
{public string StudentId { get; }public string Name { get; set; }private double[] grades;// 计算属性public double GPA { get {if (grades.Length == 0) return 0;return grades.Average();} }public Student(string studentId, string name){StudentId = studentId;Name = name;grades = new double[0];}public void AddGrade(double grade){Array.Resize(ref grades, grades.Length + 1);grades[grades.Length - 1] = grade;}public void DisplayInfo(){Console.WriteLine($"学号: {StudentId}, 姓名: {Name}, 平均分: {GPA:F1}");}
}

学生成绩管理流程图

学生成绩管理流程图

练习3:游戏角色战斗系统游戏角色类

class GameCharacter
{public string Name { get; }public int Health { get; private set; }public bool IsAlive => Health > 0;public GameCharacter(string name){Name = name;Health = 100;}public void Attack(GameCharacter target){if (!IsAlive || !target.IsAlive) return;int damage = 20;target.TakeDamage(damage);Console.WriteLine($"{Name} 攻击了 {target.Name}");}public void TakeDamage(int damage){Health -= damage;if (Health < 0) Health = 0;}
}

游戏战斗系统流程图

游戏战斗系统流程图

💡 重点回顾

  • 类与对象:类是蓝图,对象是具体实例

  • 封装性:使用访问修饰符控制成员可见性

  • 字段与属性:字段存储数据,属性提供安全访问

  • 方法重载:同名方法,不同参数列表

  • 构造函数:初始化对象,支持重载

  • 静态成员:属于类本身,所有实例共享

面向对象核心概念关系图

面向对象核心概念关系图

🎯 综合项目挑战:图书馆管理系统

创建一个完整的图书馆管理系统,包含以下功能:

核心类设计

Book类

  • 属性:ISBN、书名、作者、出版年份、是否借出

  • 方法:借书、还书、显示信息

Member类

  • 属性:会员ID、姓名、借书列表

  • 方法:借书、还书、显示借阅历史

Library类

  • 属性:图书列表、会员列表

  • 方法:添加图书、搜索图书、统计信息

图书馆系统架构图

图书馆系统架构图

高级功能

  • 使用静态成员跟踪总数

  • 实现多条件图书搜索

  • 添加借书限制(最多5本)

  • 实现逾期罚款系统

图书借阅流程

图书借阅流程

图书借阅流程

通过这个完整的项目,你将全面掌握C#面向对象编程的核心概念和实践技能!

4.6 附录

教程源码已上传网盘,需要请自取

  • 【第四章:C# 面向对象编程详解:从类与对象到完整项目实践教程(夸克)】

  • 【第四章:C# 面向对象编程详解:从类与对象到完整项目实践教程(迅雷)】

  • 【教程源码合集,跟随文章更新而更新】(夸克)

  • 【教程源码合集,跟随文章更新而更新】(迅雷)

  • 【C#入门课程52课视频教程】(迅雷)

  • 【C#入门课程52课视频教程】(夸克)

  • 【Visual Studio安装包合集】

  • 【SQL Server安装包合集(2008R2—2019)】

http://www.dtcms.com/a/597839.html

相关文章:

  • DDoS防护:为企业业务保驾护航的高可用盾牌
  • 企业产品做哪个网站推广好建筑培训课程有哪些
  • 模版 c++
  • LLaMA Factory微调大模型
  • UaGateway构建高可用OPC UA架构:实现冗余通信与数据聚合
  • Linux之vmlinux文件段布局和arm64 的链接脚本vmlinux.lds.S分析
  • C#6、三种主要的错误类型是什么
  • 使用Selenium进行网页自动化
  • 论坛网站建设推广优化wordpress主题下载资源
  • 网站推广文章范例在哪里查企业信息最准确
  • MCP驱动的Rgentic RRG(向量数据库+网络搜索)
  • 网站漏洞怎么修复上海劳务市场招聘信息查询
  • 异常的分类
  • 做时时网站要多少钱用虚拟机做网站服务器
  • 任性动图教程2 -如何让诗词生成动图
  • 零基础学JAVA--Day29( StringBuffer+ StringBuilder)
  • 做源码演示的网站果洛wap网站建设多少钱
  • Zabbix7设置告警邮件提醒
  • 【九、Linux访问网络附加存储】
  • 网站模块分析枣庄有做网站的吗
  • 记事本做网站怎么改字体出入合肥最新通知今天
  • 网站建设与管理任务分工可做网站的免费空间
  • 常见的自动化测试框架有哪些?(Selenium、Appium、Cypress等)
  • 做彩票网站多少钱网站建设道冲
  • 从C++开始的编程生活(12)——vector简单介绍和迭代器
  • 【MySQL | 基础】DQL
  • 为什么Redis不支持回滚
  • 中航网站建设国家icp备案网站
  • 中国室内设计联盟官方网站入口360建筑网怎么重新注册
  • 专业网站制作企业公司网站的制作公司