C# 面向对象编程技术概述

C# 是一种现代化的面向对象编程语言,提供了丰富的特性来支持面向对象的编程范式。以下是 C# 中面向对象编程的核心概念和技术:

核心概念

1. 类与对象

类是对象的蓝图,定义了对象的属性和行为。对象是类的实例。

// 定义一个类
public class Person
{// 字段private string name;private int age;// 属性public string Name{get { return name; }set { name = value; }}public int Age{get { return age; }set {if (value >= 0)age = value;elsethrow new ArgumentException("年龄不能为负数");}}// 构造函数public Person(string name, int age){Name = name;Age = age;}// 方法public void SayHello(){Console.WriteLine($"你好,我是{Name},今年{Age}岁。");}
}// 创建对象并使用
Person person = new Person("张三", 30);
person.SayHello(); // 输出: 你好,我是张三,今年30岁。
2. 继承

继承允许创建一个新类(子类)来继承现有类(父类)的属性和方法。

// 父类
public class Animal
{public string Name { get; set; }public Animal(string name){Name = name;}public void Eat(){Console.WriteLine($"{Name}正在吃东西。");}
}// 子类
public class Dog : Animal
{public Dog(string name) : base(name) { }// 新增方法public void Bark(){Console.WriteLine($"{Name}正在叫。");}
}// 使用继承
Dog dog = new Dog("旺财");
dog.Eat();  // 输出: 旺财正在吃东西。
dog.Bark(); // 输出: 旺财正在叫。
3. 多态

多态允许通过父类类型引用子类对象,并在运行时决定调用哪个方法。

// 基类
public abstract class Shape
{public abstract double Area(); // 抽象方法
}// 子类
public class Circle : Shape
{public double Radius { get; set; }public Circle(double radius){Radius = radius;}public override double Area(){return Math.PI * Radius * Radius;}
}public class Rectangle : Shape
{public double Width { get; set; }public double Height { get; set; }public Rectangle(double width, double height){Width = width;Height = height;}public override double Area(){return Width * Height;}
}// 使用多态
Shape circle = new Circle(5);
Shape rectangle = new Rectangle(4, 6);Console.WriteLine($"圆的面积: {circle.Area()}");    // 输出: 圆的面积: 78.5398163397448
Console.WriteLine($"矩形的面积: {rectangle.Area()}"); // 输出: 矩形的面积: 24
4. 封装

封装通过访问修饰符(如 public, private, protected)控制类成员的访问级别。

public class BankAccount
{private double balance; // 私有字段,外部无法直接访问public void Deposit(double amount){if (amount > 0)balance += amount;}public bool Withdraw(double amount){if (amount > 0 && balance >= amount){balance -= amount;return true;}return false;}public double GetBalance(){return balance;}
}// 使用封装
BankAccount account = new BankAccount();
account.Deposit(1000);
bool success = account.Withdraw(500);
Console.WriteLine($"取款成功: {success}, 余额: {account.GetBalance()}"); 
// 输出: 取款成功: True, 余额: 500

高级特性

1. 接口

接口定义了一组方法签名,但不包含实现。类可以实现多个接口。

// 定义接口
public interface IAnimal
{void Eat();void Sleep();
}// 实现接口
public class Cat : IAnimal
{public void Eat(){Console.WriteLine("猫吃鱼");}public void Sleep(){Console.WriteLine("猫睡觉");}
}// 使用接口
IAnimal cat = new Cat();
cat.Eat();   // 输出: 猫吃鱼
cat.Sleep(); // 输出: 猫睡觉
2. 抽象类

抽象类不能实例化,只能作为基类。它可以包含抽象方法和非抽象方法。

// 抽象类
public abstract class Vehicle
{public abstract void Start(); // 抽象方法public void Stop(){Console.WriteLine("车辆停止");}
}// 具体类
public class Car : Vehicle
{public override void Start(){Console.WriteLine("汽车启动");}
}// 使用抽象类
Vehicle car = new Car();
car.Start(); // 输出: 汽车启动
car.Stop();  // 输出: 车辆停止
3. 事件与委托

委托是一种类型,它可以引用一个或多个方法。事件基于委托,用于实现发布-订阅模式。

// 定义委托
public delegate void EventHandler(string message);// 发布者类
public class Publisher
{// 定义事件public event EventHandler? MyEvent;public void RaiseEvent(){MyEvent?.Invoke("事件被触发");}
}// 订阅者类
public class Subscriber
{public void HandleEvent(string message){Console.WriteLine($"收到消息: {message}");}
}// 使用事件和委托
Publisher publisher = new Publisher();
Subscriber subscriber = new Subscriber();// 订阅事件
publisher.MyEvent += subscriber.HandleEvent;// 触发事件
publisher.RaiseEvent(); // 输出: 收到消息: 事件被触发
4. 特性(Attributes)

特性用于为程序元素(类、方法、属性等)添加元数据。

// 自定义特性
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class DescriptionAttribute : Attribute
{public string Description { get; }public DescriptionAttribute(string description){Description = description;}
}// 应用特性
[Description("这是一个用户类")]
public class User
{[Description("获取用户名")]public string GetUserName(){return "John Doe";}
}// 反射获取特性信息
Type type = typeof(User);
DescriptionAttribute? classAttr = type.GetCustomAttribute<DescriptionAttribute>();
Console.WriteLine($"类描述: {classAttr?.Description}");MethodInfo method = type.GetMethod("GetUserName");
DescriptionAttribute? methodAttr = method?.GetCustomAttribute<DescriptionAttribute>();
Console.WriteLine($"方法描述: {methodAttr?.Description}");// 输出:
// 类描述: 这是一个用户类
// 方法描述: 获取用户名

总结

C# 的面向对象编程提供了丰富的特性,包括类、继承、多态、封装、接口、抽象类、事件委托和特性等。这些特性使得代码更加模块化、可维护和可扩展,是构建大型应用程序的基础。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/86244.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/86244.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/86244.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

感知框2D反投是咋回事?

一、感知框&#xff1a;“2D 框反投” 是咋回事&#xff1f;&#xff08;以自动驾驶识别车辆为例&#xff09; 1. 核心逻辑&#xff1a;从图像特征 “反推” 目标框 简单说&#xff0c;先用算法在 2D 图像里识别特征&#xff08;比如车辆的轮廓、颜色、纹理&#xff09;&#…

五分钟了解@ExcelIgnoreUnannotated注解

ExcelIgnoreUnannotated 是 EasyExcel 框架中的一个注解&#xff0c;用于控制 Excel 导入/导出时对实体类字段的处理方式。它的作用如下&#xff1a; 核心功能 忽略未标注 ExcelProperty 的字段 当添加 ExcelIgnoreUnannotated 到类上时&#xff0c;EasyExcel 会 跳过所有未显…

Windows电脑数据恢复终极指南:从原理到实战

Windows电脑数据恢复终极指南&#xff1a;从原理到实战 数据丢失是每个电脑用户都可能遭遇的噩梦。本文将为您全面解析Windows平台下的数据恢复技术&#xff0c;从基础原理到高级技巧&#xff0c;帮助您在文件误删、格式化、系统崩溃等情况下找回宝贵数据。 一、数据恢复基础…

【网络入侵检测】基于Suricata源码分析应用协议识别实现

【作者主页】只道当时是寻常 【专栏介绍】Suricata入侵检测。专注网络、主机安全&#xff0c;欢迎关注与评论。 1. 概要 &#x1f44b; 本文聚焦Suricata网络安全引擎的协议解析器实现&#xff0c;详细剖析HTTP、SSL/TLS、FTP、SSH、SMTP等协议的解析流程。 2. 源码分析 2.1 H…

Nginx SSL/TLS协议栈中配置深度解析与实践指南-优雅草卓伊凡

Nginx SSL/TLS协议栈中配置深度解析与实践指南-优雅草卓伊凡 引言&#xff1a;SSL/TLS的重要性与Nginx配置挑战 在当今互联网环境中&#xff0c;SSL/TLS加密已成为网站安全的基本要求。根据Google透明度报告显示&#xff0c;截至2023年&#xff0c;全球Chrome浏览器加载的网页…

C++字符串的行输入

1、字符串的输入 下面用一个真实的示例来进行演示&#xff1a; #include<iostream> #include<string>int main() {using namespace std;const int ArSize 20;char name[ArSize];char dessert[ArSize];cout << "Enter your name:\n";cin >>…

征服分布式系统:阿里云 Linux 多机互联与资源共享实战指南

征服分布式系统&#xff1a;阿里云 Linux 多机互联与资源共享实战指南 文章目录 征服分布式系统&#xff1a;阿里云 Linux 多机互联与资源共享实战指南一、分布式系统架构概述二、阿里云网络基础架构解析三、多机互联基础配置1. 环境准备2. 网络连通性测试3. SSH 密钥认证配置 …

AI三步诊断心理:比ChatGPT更懂人心

用人工智能(大语言模型)辅助心理治疗的研究 解决心理治疗中专业人员不足的问题,提出了一种叫“思维诊断”(DoT)的方法,让AI通过三个步骤来识别患者的“认知扭曲”(也就是负面、不合理的思维模式)。 背景:心理治疗的困境 全世界约八分之一的人有心理问题,但心理咨询师…

C++【生存游戏】开发:荒岛往事 第一期

字幕君已上线...... 副字幕君已上线...... 计数君已上线...... 彩色字幕君 ( 花了重金请来的 ) 已上线...... Doge智能系统已上线...... Doge:嗨嗨我又来了&#xff01; 观众们......已上线&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; OK LETS GO&am…

k8s强制删除podpvpvc和nsnamespace

k8s如何强制删除pod&pv&pvc和ns&namespace方法 namespace、pod、pv、pvc全部处于“Terminating”状态时&#xff0c;此时的该名称空间下的所有控制器都已经被删除了&#xff0c;之所以出现pod、pvc、pv、ns无法删除&#xff0c;那是因为kubelet 阻塞&#xff0c;有…

Python基础--4--Python常用代码示例

1、文件读写操作&#xff08;常用于日志处理、数据导入导出&#xff09; 1、代码示例 &#xff08;1&#xff09;读取文本文件内容 with open("data.txt", "r", encoding"utf-8") as f:content f.read()print(content)&#xff08;2&#xf…

单项循环链表及带头指针的链表

单项循环链表及其带头指针的链表 对于链表我们要仔细深入的学习它&#xff0c;为何呢&#xff0c;因为他是我们在后面学习非线性数据结构的基础&#xff0c;像后面的树&#xff0c;图等结构都是由链表演变出来的&#xff0c;所以我们这篇博客继续探究链表 带头指针的链表 我…

八股文——JAVA基础:解释下什么是面向对象?面向对象和面向过程的区别

面向对象和面向过程是编程的不同思想&#xff1a; 面向过程如c语言的编程形式&#xff0c;在编程时定义的是一个方法&#xff0c;然后后续执行只需要关注这个方法的作用&#xff0c;而不会将方法进行抽象&#xff0c;也就是只关注程序执行的过程细节。 面向对象如java&#x…

SuperMap iServer 关闭数据目录(datacatalog)、地图打印(webprinting)等服务

背景 漏洞扫描发现有部分低危 web 漏洞&#xff0c;项目又暂未使用数据目录服务&#xff0c;所以最简单的方案是直接关闭服务。 查阅文档发现处理自动化服务可以修改webapps\iserver\WEB-INF\iserver-geoprocessing.xml 的 enable 属性为 false 关闭&#xff0c;机器学习服务…

PyTorch 张量(Tensors)全面指南:从基础到实战

文章目录 什么是张量&#xff1f;张量初始化方法1. 直接从数据创建2. 从 NumPy 数组转换3. 基于现有张量创建4. 使用随机值或常量 张量属性张量操作设备转移索引和切片连接张量算术运算单元素张量转换 原地操作&#xff08;In-place Operations&#xff09;PyTorch 与 NumPy 互…

Maven是什么?

Maven是一个流行的Java项目管理和构建工具&#xff0c;主要用于自动化项目构建、依赖管理和项目文档生成等工作。以下是对它的简单介绍&#xff1a; 核心功能 依赖管理&#xff1a;自动管理项目所需的第三方库&#xff08;如JAR包&#xff09;&#xff0c;通过在配置文件中声…

etcd教程-快速入门使用(截图实操)集群搭建 + 原理解释

大家好&#xff0c;我是此林。 etcd 是一个高可用的键值对存储系统&#xff0c;常用于分布式系统中保存配置、服务发现和协调信息。它是 CNCF 旗下的项目之一&#xff0c;也是 Kubernetes 的核心组件之一&#xff0c;用来存储集群状态。 可以说&#xff0c;云原生场景下经常使…

OpenSSL 混合加密

openssl 中文网&#xff1a; https://www.openssl.net.cn/ 目录 对称加密特点常见算法案例&#xff08;使用 AES&#xff09; 非对称加密特点常见算法案例&#xff08;使用 RSA&#xff09; 混合加密场景加密&#xff08;使用 AES&#xff09;解密 总结 对称加密 特点 加密和解…

AI驱动的DevOps运维与云服务部署自动化

引言 当前&#xff0c;云计算和DevOps实践让开发者能够管理成百上千台服务器和容器&#xff0c;但随之而来的运维复杂度也急剧提升。运维工程师经常需要部署多环境应用、维护大规模云主机、排查集群故障等任务。这些任务不仅涉及繁琐的脚本编写和命令行操作&#xff0c;还需要对…

Spring Boot动态数据源切换:优雅实现多数据源管理

在复杂的企业应用中&#xff0c;多数据源管理是常见需求。本文将介绍如何基于Spring Boot实现优雅的动态数据源切换方案&#xff0c;通过自定义注解和AOP实现透明化切换。 核心设计思路 通过三层结构实现数据源动态路由&#xff1a; 1. 注解层&#xff1a;声明式标记数据源 2…