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

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对象
    }
}

相关文章:

  • C++ ——— 模拟实现 AVL 树的插入
  • Win10配置VSCode的C/C++编译环境
  • 前后端分离系统架构:基于Spring Boot的最佳实践
  • 基于AT89C52单片机的出租车计价器
  • 【Linux进程一】进程的概念
  • CUDA专题1:CUDA介绍
  • Docker启动ES容器打包本地镜像
  • 基于RISC-V内核完全自主可控国产化MCU芯片
  • Shell脚本和Bat脚本区别
  • 我的世界地下城DLC开发的第二天
  • 第9章:LangChain结构化输出-示例2(数字提取服务)
  • 公开整理-最新中国城市统计NJExcel+PDF版本(1985-2024年)
  • B. Skibidus and Ohio
  • DeepSheek 本地部署
  • Service Worker 实现离线应用思路
  • 简识Kafka集群与RocketMQ集群的核心区别
  • 网络安全研究
  • 在运维工作中,磁盘文件满了,怎么办?
  • 綫性與非綫性泛函分析與應用_2.賦范向量空間-母本
  • Java——抽象类
  • 淮安哪里做网站/随州网络推广
  • 搜索引擎网站推广怎么做/推广模式包括哪些模式
  • 棋牌网站代理/网页链接
  • 低价网站建设推广报价/免费刷赞网站推广qq免费
  • 注册公司网站多少钱/上线了建站
  • 网络管理软件app/黑锋网seo