C#_封装详解

封装

封装 被定义为"把一个或多个项目封闭在一个物理的或者逻辑的包中"。在面向对象程序设计方法论中,封装是为了防止对实现细节的访问。

抽象和封装是面向对象程序设计的相关特性。抽象允许相关信息可视化,封装则使程序员实现所需级别的抽象

封装使用 访问修饰符 来实现。一个 访问修饰符 定义了一个类成员的范围和可见性。C# 支持的访问修饰符如下所示:

  • Public
  • Private
  • Protected
  • Internal
  • Protected internal

Public 访问修饰符

Public 访问修饰符允许一个类将其成员变量和成员函数暴露给其他的函数和对象。任何公有成员可以被外部的类访问。

下面的实例说明了这点: 

using System;namespace RectangleApplication{class Rectangle{//成员变量public double length;public double width;public double GetArea(){return length * width;}public void Display(){Console.WriteLine("长度: {0}", length);Console.WriteLine("宽度: {0}", width);Console.WriteLine("面积: {0}", GetArea());}}//end class Rectangle    class ExecuteRectangle{static void Main(string[] args){Rectangle r = new Rectangle();r.length = 4.5;r.width = 3.5;r.Display();Console.ReadLine();}}
}

当上面的代码被编译和执行时,它会产生下列结果:

长度: 4.5
宽度: 3.5
面积: 15.75

在上面的实例中,成员变量 length 和 width 被声明为 public,所以它们可以被函数 Main() 使用 Rectangle 类的实例 r 访问。

成员函数 Display() 和 GetArea() 也可以不通过类的实例直接访问这些变量。

成员函数 Display() 也被声明为 public,所以它也能被 Main() 使用 Rectangle 类的实例 r 访问。

Private 访问修饰符

Private 访问修饰符允许一个类将其成员变量和成员函数对其他的函数和对象进行隐藏。只有同一个类中的函数可以访问它的私有成员。即使是类的实例也不能访问它的私有成员。

下面的实例说明了这点:

using System;namespace RectangleApplication{class Rectangle{//成员变量private double length;private double width;public void Acceptdetails(){Console.WriteLine("请输入长度:");length = Convert.ToDouble(Console.ReadLine());Console.WriteLine("请输入宽度:");width = Convert.ToDouble(Console.ReadLine());}public double GetArea(){return length * width;}public void Display(){Console.WriteLine("长度: {0}", length);Console.WriteLine("宽度: {0}", width);Console.WriteLine("面积: {0}", GetArea());}}//end class Rectangle    class ExecuteRectangle{static void Main(string[] args){Rectangle r = new Rectangle();r.Acceptdetails();r.Display();Console.ReadLine();}}
}

当上面的代码被编译和执行时,它会产生下列结果:

请输入长度:
4.4
请输入宽度:
3.3
长度: 4.4
宽度: 3.3
面积: 14.52

在上面的实例中,成员变量 length 和 width 被声明为 private,所以它们不能被函数 Main() 访问。

成员函数 AcceptDetails() 和 Display() 可以访问这些变量。

由于成员函数 AcceptDetails() 和 Display() 被声明为 public,所以它们可以被 Main() 使用 Rectangle 类的实例 r 访问。

Protected 访问修饰符

Protected 访问修饰符允许子类访问它的基类的成员变量和成员函数。这样有助于实现继承。

Internal 访问修饰符

internal也是一各类型/成员修饰符(被修饰的类型或者成员称为内部类型或成员),只是它所修饰的类只能在同一个程序集中被访问,而同一个程序集表示同一个dll程序集或同一个exe程序集。在vs中一个项目会生成一个dll文件,因此这个dll或这个项目也就是一个程序集。

下面的实例说明了这点:

using System;namespace RectangleApplication{class Rectangle{//成员变量internal double length;internal double width;double GetArea(){return length * width;}public void Display(){Console.WriteLine("长度: {0}", length);Console.WriteLine("宽度: {0}", width);Console.WriteLine("面积: {0}", GetArea());}}//end class Rectangle    class ExecuteRectangle{static void Main(string[] args){Rectangle r = new Rectangle();r.length = 4.5;r.width = 3.5;r.Display();Console.ReadLine();}}
}

当上面的代码被编译和执行时,它会产生下列结果:

长度: 4.5
宽度: 3.5
面积: 15.75

在上面的实例中,请注意成员函数 GetArea() 声明的时候不带有任何访问修饰符。如果没有指定访问修饰符,则使用类成员的默认访问修饰符,即为 private

Protected Internal 访问修饰符

Protected Internal 访问修饰符允许一个类将其成员变量和成员函数对同一应用程序内的子类以外的其他的类对象和函数进行隐藏。这也被用于实现继承。

范围比较

  •  (1) Pubilc :任何公有成员可以被外部的类访问。
  •  (2) Private 兴趣使然_-CSDN博客:只有同一个类中的函数可以访问它的私有成员。
  •  (3) Protected :该类内部和继承类中可以访问。
  •  (4) internal : 同一个程序集的对象可以访问。
  •  (5) Protected internal :3 和 4 的并集,符合任意一条都可以访问。

即:

private < internal/protected < protected internal < public

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

绿色数据中心:实现可持续发展和具备盈利能力的全闪存解决方案

数据中心成为了当今数字世界的支柱&#xff0c;负责存储、处理和分发驱动几乎所有数字服务产生&#xff08;从网上银行到即时消息&#xff09;的数据。这使得数字中心逐渐成为了现代商业基础设施的关键组成部分。 但是&#xff0c;随之而来的是&#xff0c;数据中心也已经成为…

基于asp.net固定资产管理系统设计与实现

博主介绍&#xff1a;专注于Java vue .net php phython 小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设&#xff0c;从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不然下次找不到哟 我的博客空间发布了1000毕设题目 方便大家学习使用 感兴趣的…

如何着手创建企业数据目录?(三)权限管理及版本控制

前文导读&#xff1a; 《如何着手创建企业数据目录&#xff1f;&#xff08;一&#xff09;数据目录的设定》 《如何着手创建企业数据目录&#xff1f;&#xff08;二&#xff09;数据的命名与维护》 前面聊过了数据目录的设定、数据命名规则和维护规则&#xff0c;今天我们继续…

34.打字机效果 水平滚动贴合

打字机效果 创建打字机效果动画。 定义两个动画,typing 用于字符动画,blink 用于光标动画。使用 ::after 伪元素在容器元素中添加光标。使用 JavaScript 为内部元素设置文本,并设置包含字符数的 --characters 变量。这个变量用于文本动画。使用 white-space: nowrap 和 overflo…

【华为杯】2024数学建模研赛题目

2024数学建模研赛题目已经发布 各个赛题题目如下&#xff1a; A题 B题 C题 D题 E题 F题 赛题完整版在文末&#xff0c;点击下方名片。

离散型制造业MES系统主要功能介绍

一、离散型制造业的特点 离散型制造业是指生产过程中涉及多个独立工序或步骤&#xff0c;且这些工序之间相对独立、缺乏连续性的企业。其特点主要包括&#xff1a; 产品种类多&#xff0c;开发频繁&#xff1a; 离散型制造业通常需要进行多品种产品开发&#xff0c;产品种类繁…

OpenCV特征检测(2)边缘检测函数Canny()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 使用 Canny 算法 48在图像中查找边缘。 该函数使用 Canny 算法在输入图像中查找边缘&#xff0c;并在输出地图 edges 中标记它们。在 threshold1…

微服务架构---Ribbon\Feign

Ribbon(负载均衡) Ribbon概述 在 SpringCloud 中&#xff0c; Nacos⼀般配合Ribbon进行使用&#xff0c;Ribbon提供了客户端负载均衡的功能&#xff0c;Ribbon利用从Nacos中读取到的服务信息&#xff0c;在调用服务节点提供的服务时&#xff0c;会合理的进行负载。 Ribbon作…

Java内部类一口气讲完!( •̀ ω •́ )✧

Java 内部类 Java面向对象的设计 - Java 内部类 什么是内部类&#xff1f; 作为包的成员的类被称为顶级类。 一个类可以在另一个类中声明。这种类型的类称为内部类。 如果在另一个类中声明的类被显式或隐式声明为static&#xff0c;它被称为嵌套类&#xff0c;而不是内部类…

Apache Flink 流批融合技术介绍

摘要&#xff1a;本文整理自阿里云高级研发工程师、Apache Flink Contributor 周云峰老师在 Apache Asia CommunityOverCode 2024中的分享。内容主要分为以下三个部分&#xff1a; 从流批一体到流批融合流批融合的技术解决方案社区进展及未来展望 一、从流批一体到流批融合 1&…

音视频开发之旅(95)-基于多模态的画质评测算法Q-Align

目录 1.背景与问题 2.人工MOS评测的过程 3.评分等级与评分的转换 4.构建对话式指令数据集 5.Q-ALIGN模型结构 6.实验结果 7.源码分析 8.资料 一、背景和问题 多模态模型&#xff08;LMMs&#xff09;在视觉和语言方面展现出非常强大的能力&#xff0c;它们能够很好地理…

【数据结构】假设二叉树采用二叉链表存储,编写一棵二又树中序遍历的非递归算法。

编程题&#xff1a; 假设二叉树采用二叉链表存储&#xff0c;编写一棵二又树中序遍历的非递归算法。 分析&#xff1a; 算法描述&#xff1a; 非递归中序遍历二叉树的算法使用栈来辅助实现。首先&#xff0c;从根节点开始&#xff0c;沿着左子树不断向下&#xff0c; 将每个节…

DataFrame生成excel后为什么多了一行数字

问题描述 python查询数据生成excel文件&#xff0c;生成的excel多了第一行数字索引&#xff0c;1,2,3,4,5...... 代码&#xff1a; df pd.DataFrame(data)df.to_excel(filename, sheet_name用户信息表, indexFalse) 解决&#xff1a; 原理也很简单&#xff0c;就是设置个参…

MCS-51汇编

伪指令&#xff1a; EQU: Equal&#xff0c;定义常量 COUNT EQU 10H ; 定义一个符号名COUNT&#xff0c;其值为10H DELAY EQU 500 ; 定义一个符号名DELAY&#xff0c;其值为500 数据传送&#xff1a; MOV: MOVE&#xff0c;传送数据 MOVC: 算术运算&#xff1a; 跳转…

开源 AI 智能名片 S2B2C 商城小程序与正能量融入对社群归属感的影响

摘要&#xff1a;本文探讨了开源 AI 智能名片 S2B2C 商城小程序在社群运营中的作用&#xff0c;以及融入正能量对提高社群归属感的关键意义。通过分析正能量的精神感染力和对社群氛围的积极影响&#xff0c;阐述了在开源 AI 智能名片 S2B2C 商城小程序的各类活动中融入正能量的…

数据结构之线性表——LeetCode:707. 设计链表,206. 反转链表,92. 反转链表 II

707. 设计链表 题目描述 707. 设计链表 你可以选择使用单链表或者双链表&#xff0c;设计并实现自己的链表。 单链表中的节点应该具备两个属性&#xff1a;val 和 next 。val 是当前节点的值&#xff0c;next 是指向下一个节点的指针/引用。 如果是双向链表&#xff0c;则…

【经验技巧】IBIS AMI模型眼图仿真问题探讨

最近&#xff0c;有同事问我&#xff1a;“拿到供应商的IBIS AMI模型&#xff0c;怎么判断是否可以进行应力&#xff08;统计&#xff09;眼图的仿真呀&#xff1f;如果不能进行&#xff0c;又怎么判断结果是瞬态仿真呢&#xff1f;” 不得不说&#xff0c;这的确是一个不错的话…

2024秋面向对象程序设计pta-实验二

6-1 设计一个矩形类Rectangle class Rectangle{ double width1; double height 1; public Rectangle(){} public Rectangle(double width, double height){ this.widthwidth; this.heightheight;} public double getArea(){ return width*height;} public double getPerimete…

en造数据结构与算法C# 用Unity实现简单的群组行为算法 之 对齐

en造数据结构与算法C# 用Unity实现简单的群组行为算法 之 聚集-CSDN博客 en造数据结构与算法C# 用Unity实现简单的群组行为算法 之 聚集-CSDN博客 演示 思路 1.检测 自然是沿用前两节的检测范围 2.对齐朝向 对齐朝向就是邻居鸟的forward加起来再除总数得到平均数 3.对齐…

3657A/B/AM/BM矢量网络分析仪

苏州新利通 3657A/B/AM/BM 矢量网络分析仪 3657系列矢量网络分析仪适用于无线通信、有线电视、教育及汽车电子等领域&#xff0c;可用于对滤波器、放大器、天线、电缆、有线电视分接头等射频元件的性能测量。该产品采用Windows操作系统&#xff1b;具有误差校准功能、时域功能…