C# 封装

文章目录

  • 前言
  • [一、Public 访问修饰符](#一、Public 访问修饰符)
  • [二、Private 访问修饰符](#二、Private 访问修饰符)
  • [三、Protected 访问修饰符](#三、Protected 访问修饰符)
  • [四、Internal 访问修饰符](#四、Internal 访问修饰符)
  • [五、Protected Internal 访问修饰符](#五、Protected Internal 访问修饰符)

前言

抽象与封装作为面向对象程序设计中紧密相关的两大特性,相辅相成。抽象侧重于让相关信息以一种合适的方式可视化呈现,帮助开发者和使用者从更高层次去理解和把握程序逻辑;而封装则为开发者提供了实现所需抽象级别的有力手段,通过合理控制类成员的访问权限,将类内部的实现细节巧妙地隐藏起来,只对外暴露必要的接口,使得程序在内部逻辑变化时,外部调用部分无需大幅改动,增强了程序的可维护性和可扩展性。C# 支持以下几种常用的访问修饰符:

一、Public 访问修饰符

Public 访问修饰符宛如一扇敞开的大门,允许一个类将其成员变量和成员函数毫无保留地暴露给其他的函数和对象。这意味着,任何公有成员在整个程序世界里都是畅通无阻的,外部的类可以轻松地对其进行访问。

以下通过一个具体实例来深入理解 Public 访问修饰符的使用及效果:

csharp 复制代码
using System;

namespace RectangleApplication
{
    class Rectangle
    {
        // 成员变量,声明为 public,对外完全可见
        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());
        }
    }// Rectangle 类定义结束

    class ExecuteRectangle
    {
        static void Main(string[] args)
        {
            // 创建 Rectangle 类的实例
            Rectangle r = new Rectangle();
            // 直接通过实例访问 public 成员变量,为其赋值
            r.length = 4.5;
            r.width = 3.5;
            // 调用 public 成员函数进行展示操作
            r.Display();
            Console.ReadLine();
        }
    }
}

当上述代码被编译和执行时,会输出如下结果:

plaintext 复制代码
长度: 4.5
宽度: 3.5
面积: 15.75

在这个实例中,成员变量 length 和 width 被声明为 public,所以它们能够被 Main 函数所在的类(也就是 ExecuteRectangle 类)使用 Rectangle 类的实例 r 自由访问。同样,成员函数 Display() 和 GetArea() 由于也被声明为 public,不仅可以在类内部直接访问相关的 public 成员变量进行运算等操作,而且在外部的 Main 函数中,也能够通过实例 r 顺利调用,充分展示了 public 访问修饰符所赋予的高开放性和对外可见性特点。

二、Private 访问修饰符

与 Public 访问修饰符截然相反,Private 访问修饰符恰似一道坚固的屏障,允许一个类将其成员变量和成员函数严严实实地对其他的函数和对象隐藏起来。只有在同一个类内部的函数才有资格访问它的私有成员,哪怕是类的实例本身,在类的外部也无法触及这些私有成员,这就为类内部的数据和逻辑提供了高度的保密性和安全性。

下面通过一个具体的代码示例来阐释 Private 访问修饰符的应用场景和作用:

csharp 复制代码
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 类的实例
            Rectangle r = new Rectangle();

            // 通过公有方法 AcceptDetails() 从用户输入获取矩形的长度和宽度,而不是直接访问私有变量
            r.AcceptDetails();

            // 通过公有方法 Display() 显示矩形的属性和面积
            r.Display();

            Console.ReadLine();
        }
    }
}

当这段代码被编译并执行后,会产生如下交互过程及结果:

plaintext 复制代码
请输入长度:
5
请输入宽度:
3
长度: 5
宽度: 3
面积: 15

在这个示例中,length 和 width 被声明为私有成员变量,这样做有效地防止了在类的外部直接对它们进行访问和随意修改,保障了数据的完整性和安全性。AcceptDetails 方法作为公有方法,充当了外界与私有变量之间的桥梁,允许用户输入矩形的长度和宽度,这便是通过公有方法来合理操作私有变量的典型例子。GetArea 方法在类内部基于私有变量计算矩形的面积,Display 方法则用于展示矩形的各项属性及面积。在 ExecuteRectangle 类中,只能通过创建 Rectangle 类的实例,然后调用其公有方法来执行相应操作,无法绕过公有接口直接触及私有成员。这种方式完美地实现了封装的理念,将类内部的数据和实现细节保护起来,同时又对外提供了规范的操作途径。

三、Protected 访问修饰符

Protected 访问修饰符在面向对象编程的继承体系中有着独特的地位,它犹如一把特制的钥匙,允许子类访问它的基类的成员变量和成员函数。这种访问权限的设置为实现继承这一强大特性奠定了基础,使得子类能够在一定程度上复用基类的代码逻辑和数据,并且可以根据自身的需求进行扩展和定制。关于它在继承方面更深入的应用和详细讨论,我们会在后续专门讲解继承的章节中进一步展开阐述。

四、Internal 访问修饰符

Internal 访问修饰符扮演着一种在程序内部 "局部开放" 的角色,它允许一个类将其成员变量和成员函数暴露给当前程序中的其他函数和对象。换句话说,只要是定义在该成员所定义的应用程序内的任何类或方法,都具备访问带有 internal 访问修饰符成员的权限,就好像在一个特定的 "圈子" 内共享资源一样。

以下是一个展示 Internal 访问修饰符使用的实例:

csharp 复制代码
using System;

namespace RectangleApplication
{
    class Rectangle
    {
        // 成员变量,声明为 internal,在当前程序集内可见
        internal double length;
        internal double width;

        // 成员函数,用于计算矩形的面积,虽然未带访问修饰符,但默认是 private,只能在类内部调用
        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();
        }
    }
}

当上述代码被编译和执行时,会输出如下结果:

plaintext 复制代码
长度: 4.5
宽度: 3.5
面积: 15.75

在这个实例中需要注意的是,成员函数 GetArea() 在声明的时候没有明确带有任何访问修饰符,此时按照 C# 的规则,它会使用类成员的默认访问修饰符,也就是 private,这意味着它只能在 Rectangle 类内部被调用。而成员变量 length 和 width 声明为 internal,在当前程序集内的 Main 函数所在的类(也就是 ExecuteRectangle 类)中,可以通过 Rectangle 类的实例 r 对它们进行访问,从而实现相应的功能展示。

五、Protected Internal 访问修饰符

Protected Internal 访问修饰符结合了 Protected 和 Internal 两者的特点,它像是一把 "复合型钥匙",允许在本类、派生类或者包含该类的程序集中进行访问。这种访问权限的设置在实现复杂的继承关系以及程序集内部的资源共享与复用方面发挥着重要作用,同样也是实现面向对象编程中继承特性的得力工具之一,为开发者在构建多层次、多模块的程序架构时提供了更加灵活的访问控制手段。

相关推荐
桃园码工3 分钟前
第一章:Go 语言概述 1.什么是 Go 语言? --Go 语言轻松入门
开发语言·后端·golang
计算机学姐6 分钟前
基于SSM的宠物领养平台
java·vue.js·spring·maven·intellij-idea·mybatis·宠物
努力更新中11 分钟前
Python浪漫之画一个音符♪
开发语言·python
泰山小张只吃荷园16 分钟前
期末Python复习-输入输出
java·前端·spring boot·python·spring cloud·docker·容器
Mr_Xuhhh19 分钟前
程序地址空间
android·java·开发语言·数据库
YSRM25 分钟前
异或-java-leetcode
java·算法·leetcode
大明湖的狗凯.28 分钟前
MySQL 中的乐观锁与悲观锁
java·数据库·mysql
凤枭香28 分钟前
Python Selenium介绍(二)
开发语言·爬虫·python·selenium
疯狂吧小飞牛30 分钟前
C语言解析命令行参数
c语言·开发语言
z2023050833 分钟前
linux之调度管理(13)- wake affine 唤醒特性
java·开发语言