C#基础:类的三大特性 之 封装

一、封装、继承、多态关系说明

封装、继承、多态这三大特性是相互关联的,封装和继承几乎都是为多态而准备的。

封装是基础,继承是关键,多态性是补充。

多态性存在于继承性之中,它是继承性的进一步扩展,没有继承就没有多态。

通过多态可以实现代码重用,减少代码量,提高代码的可扩展性和可维护性。

二、什么是封装

封装,就是将类的属性和方法封闭起来,外部成员不可直接调用,只能通过预留的接口访问。

限制对数据的直接访问,隐藏内部实现细节,仅对外提供必要的公共接口来与外部进行交互。

三、封装的好处

1、在一定程度上保证了数据的稳定性、安全性。

类内部的数据,外部无法直接访问,信任的可修改内部,不信任的不可修改内部;

防止非法操作和数据篡改,确保内部数据的安全。

2、提高代码的可维护性,降低开发难度

外部只需关注对象的公共接口,修改对象内部实现时,对其他部分的影响较小。

减少因为一处修改导致其他程序跟着被修改的情况,极大提高代码可维护性;

3、也能够简化编程,提高代码的复用

有时候我们并不想知道其原理,只需要会调用即可,外部的对象只需要访问一个简单的接口函数。

另外,把具有相似功能的方法和相关数据封装在一起形成类,在其他地方需要类似功能时,可直接使用这个类,避免重复编写代码。

4、提高程序的模块化,方便项目管理

可以将不同的功能模块划分到不同的类中,使程序结构更加清晰,便于功能管理和扩展。

四、封装体现和使用

1、类的访问修饰符

通过访问修饰符,类的属性或方法可以选择是否允许被外部访问,从而限制了外部的权限,保护了内部的数据的稳定性。

在C#中,有不同的访问修饰符:

(1)public:可以在项目外被访问,任意存取,可以被继承。

(2)pirvate:只能在本类中被访问,只可以被本类所存取,不能被继承。

(3)protected:只能在本类中被访问,可以被继承。

(4)internal:只能在同一程序集中被访问,可以跨类。可以被继承。

在C#中,新增了internal这一关键字。internal的作用域为同一程序集。

程序集的概念可以理解为一个工程、项目,编译后的dll文件或exe文件。

也就是说,internal修饰符修饰后,该类只能在单一工程内访问,如果其他项目访问是不行的。

//外部可访问的Student类
public class Student
{...
}
2、类的属性

定义字段为私有private,

然后再定义一个与该字段对应的public属性,对属性设置具有对外使用的set和get方法;

外部通过属性来获取和设置类内部的字段数据;

get和set是属性访问器,分别用于读取和写入字段的值,控制对字段的访问级别和验证数据的完整性。

    // 只能类内部使用的私有字段private string name; // 外部可访问的公开属性public string Name{get { return name; }set { name = value; }}
3、类的方法/函数

 将对象的行为封装在方法中,通过方法来控制对象的状态和行为,方法的访问级别也可由访问修饰符来定义。

public class Test(){int x =0;static void Main(string[] args)//程序执行入口{x=10;PrintFunc();}// 介于Public和private访问范围之间的,受一定保护限制的,可访问方法protected void PrintFunc(){x=x+1;Console.WriteLine("X=: {x}");}
}
4、类的构造函数

C# 构造函数是一种特殊的方法,用于在创建对象时初始化对象;

使用类的构造函数,对新创建的类对象里的数据进行赋值,初始化,可确保对象在使用前处于有效状态。

注意事项:

(1)构造函数的名称必须与它所属的类名完全相同,包括大小写。

(2)构造函数不允许有返回类型,包括void也不行。

(3)当使用new关键字创建类的对象时,构造函数会被自动调用。

一个类可以有多个构造方法(即多种初始化类的方法),根据创建类时传入的参数不同,自动使用不同的构造函数,对类对象进行不同初始化设置,以满足不同的创建对象的需求;

using System;public class Student
{protected int id= 1;// 无参构造函数public Student(){id = 100;Console.WriteLine($"学生的id值为: {id}");}// 有参构造函数public Student(string msg){Console.WriteLine($"学生的id值为: {id},传入的消息为: {msg}");}
}class TestProgram
{static void Main(){Console.WriteLine("Test:");Student student1 = new Student();//使用无参构造函数,创建id为100的Student对象Student student2 = new Student("Hello");//使用带参构造函数,创建id为1的Student对象}
}

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

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

相关文章

vscode无法预览Markdown在线图片链接

问题:在VSCode中,打开MarkDown文件,存在在线图片链接, 但是在预览时却无法显示。 原因:因为Visual Studio Code中的MarkDown默认配置中只允许载入安全内容 解决方法: 1、输入快捷键 Ctrl Shift P 打开…

mongodb的并发优化

MongoDB的锁模式 MongoDB的锁设计 MongoDB的高性能表现离不开它的多粒度锁机制。多粒度主要可以针对不同层级的数据库对象进行枷锁,通过避免全局性的互斥来提升并发能力。从整个数据库层面看,MongoDB的并发锁的分层如下图所示: 从上往下是一…

Python 环境管理介绍

pip pip 是 Python 的标准包管理工具&#xff0c;用于安装和管理 Python 软件包。它允许你从 Python 包索引&#xff08;PyPI&#xff09;下载并安装第三方库&#xff0c;并能自动解决依赖问题。 第三方库的安装与卸载 pip install <package>pip uninstall <packag…

oracle apex post接口

日常记录 使用到了apex_json方式接收 、、、1 首先&#xff0c;接口通过body传递过来&#xff0c;成功接收到&#xff0c; 数据格式为 JSON_OBJECT_T l_json : JSON_OBJECT_T.parse(:body); 这里我用参数接收到 然后 里面是包含了 "data" 我用 继续接收到这个 l…

PLC通讯

PPI通讯 是西门子公司专为s7-200系列plc开发的通讯协议。内置于s7-200 CPU中。PPI协议物理上基于RS-485口&#xff0c;通过屏蔽双绞线就可以实现PPI通讯。PPI协议是一种主-从协议。主站设备发送要求到从站设备&#xff0c;从站设备响应&#xff0c;从站不能主动发出信息。主站…

易飞报错:输入的库位并不存在,请重新输入

首先&#xff0c;判断使用的账套是否启用了库位管理&#xff0c;若启用&#xff0c;检查库位信息是否正确&#xff0c; 若没启用&#xff0c;可以进行一下操作处理&#xff1a; 首先在公用参数中启用库位管理&#xff0c; 然后使用取消库位管理进行取消操作。 以上方法基本可以…

綫性與非綫性泛函分析與應用_3.例題-母本

第3章 巴拿赫空間 1. 巴拿赫不動點定理 例題1 問題:在完備度量空間(\mathbb{R},d)(d(x,y)=\vert x - y\vert)中,定義映射f(x)=\frac{1}{2}x + 1,求f的不動點。 解析:首先驗證f是壓縮映射。對於任意x,y\in\mathbb{R},d(f(x),f(y))=\vert(\frac{1}{2}x + 1)-(\frac{1}{2…

go语言闭包的立即执行和不立即执行

在 Go 语言中&#xff0c;闭包&#xff08;closure&#xff09;是一种特殊的函数&#xff0c;它可以访问其定义时所在的作用域中的变量&#xff0c;即使这个函数在其他地方被调用。闭包的“立即执行”和“不立即执行”主要取决于闭包的定义和调用方式。 1. 闭包的定义 闭包是…

Mybatis常用动态 SQL 相关标签

1. <if> 用于条件判断&#xff0c;当满足条件时执行对应的 SQL 片段。 示例: <select id"findUser" resultType"User">SELECT * FROM usersWHERE 11<if test"name ! null and name ! ">AND name #{name}</if><if…

500字理透react的hook闭包问题

在react中hook的闭包问题很容易在不经意间犯错&#xff0c;项目写大了之后更是难以找到到底是哪里出了问题。 为什么会出现闭包问题 出现闭包问题的原因就是函数中操作的变量不是最新的变量&#xff0c;什么意思呢&#xff0c;我们知道函数组件每次刷新都是重新运行一次函数&…

买股票的最佳时机 - 2

买卖股票的最佳时机 III 题目描述&#xff1a; 提示&#xff1a; 1 < prices.length < 1050 < prices[i] < 105 分析过程&#xff1a; 写动态规划&#xff0c;我们需要考虑一下问题&#xff1a; 定义状态状态转移方程初始条件 遍历顺序 4种状态&#xff1a; …

【HarmonyOS Next】地图使用详解(一)

背景 这系列文章主要讲解鸿蒙地图的使用&#xff0c;当前可以免费使用&#xff0c;并提供了丰富的SDK给开发者去自定义控件开发。目前可以实现个性化显示地图、位置搜索和路径规划等功能&#xff0c;轻松完成地图构建工作。需要注意的是&#xff0c;现在测试只能使用实体手机去…

【C++】 时间库chrono计算程序运行时间

C 时间库chrono计算程序运行时间 本文总结了chrono库的引入方法以及计算程序片段运行时间的方法 一、chrono库的引入方法&#xff08;注意事项&#xff09; 首先chrono是属于std命名空间的。 所以在程序中应该这样包含头文件&#xff1a; #include <chrono> using n…

计算机毕业设计SpringBoot+Vue.jst0甘肃非物质文化网站(源码+LW文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

EVM系区块链开发网节点搭建及测试详细文档

文章目录 一. 编写说明1.1 文档说明1.2 配置信息二. docker 方式部署区块链开发网2.1 centos7 部署docker环境2.1.1 卸载旧版本2.1.2 使用 yum 安装2.1.3 使用官方安装脚本自动安装2.1.4 启动并加入开机启动2.2 区块链节点镜像生成2.3 区块链开发网节点容器生成2.3.1 配置文件编…

第4章 4.1 Entity Framework Core概述

4.1.1 什么是ORM ORM (object tralstional mapping ,对象关系映射)中的“对象”指的就是C#中的对象&#xff0c;而“关系”是关系型数据库&#xff0c;“映射”指搭建数据库与C#对象之间的“桥梁”。 比如使用ORM &#xff0c;可以通过创建C#对象的方式把数据插入数据库而不需…

关于Yudao(芋道)和Ruoyi(若依)两个开源框架的发布时间、功能定位以及当前发展情况

根据现有信息&#xff0c;关于Yudao&#xff08;芋道&#xff09;和Ruoyi&#xff08;若依&#xff09;两个开源框架的发布时间、功能定位以及当前发展情况&#xff0c;可以综合如下分析&#xff1a; 一、发布时间与先后顺序 Ruoyi&#xff08;若依&#xff09; Ruoyi框架的公开…

JavaScript实现一个函数,找出数组中重复出现次数最多的元素。

JavaScript实现一个函数&#xff0c;找出数组中重复出现次数最多的元素。 实现思路 要找出数组里重复出现次数最多的元素&#xff0c;咱们可以这么干&#xff1a; 先弄个“小账本”&#xff08;也就是一个对象&#xff09;&#xff0c;用来记录数组里每个元素出现的次数。接…

10. 九转金丹炼矩阵 - 矩阵置零(标记优化)

哪吒在数据修仙界中继续他的修炼之旅。这一次,他来到了一片神秘的金丹谷,谷中有一座巨大的九转金丹炉,炉身闪烁着神秘的光芒。金丹炉的入口处有一块巨大的石碑,上面刻着一行文字:“欲破此炉,需以九转金丹之力,炼矩阵之零,标记优化定乾坤。” 哪吒定睛一看,石碑上还有…

PostgreSQL vs MongoDB:优劣分析及适用场景

PostgreSQL vs MongoDB&#xff1a;优劣分析及适用场景 PostgreSQL 和 MongoDB 是两种非常不同的数据库系统&#xff0c;它们各自具有独特的优势和适用场景。以下是对这两种数据库的优劣分析及适用场景&#xff1a; PostgreSQL 优势&#xff1a; ACID 兼容性&#xff1a;Po…