C#面向对象之三大特性: 封装

ZJ-CN 2018-08-20 原文

学到封装就会想到访问修饰符,说到访问修饰符,就会想到访问等级,或者说是访问能力的大小。当然也少不了默认的访问类型。

  1. C# 方法默认访问级别 : private (私有的) 
  2. C# 类默认访问级别 : internal    (内部的) 

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

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

C# 封装根据具体的需要,设置使用者的访问权限,并通过 访问修饰符 来实现。

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

  • public:所有对象都可以访问;(公共的)
  • private:对象本身在对象内部可以访问;(私有的)
  • protected:只有该类对象及其子类对象可以访问;(受保护的)
  • internal:同一个程序集的对象可以访问;(内部的)
  • protected internal:访问限于当前程序集或派生自包含类的类型。(内部受保护的)

对于访问修饰符中 涉及的程序集和命名空间 :   

程式集:IL+元数据

如果说命名空间是类库的逻辑组织形式,那么程序集就是类库的物理组织形式。只有同时指定类型所在的命名空间及实现该类型的程序集,才能完全限定该类型。(摘抄自《精通.NET核心技术–原来与架构》 电子工业出版社)

例如我们要用A类,则需要把包含A类的程序集(即*.DLL)引用到该工程中(物理);而在程序中要声明A类的命名空间(逻辑)。

 

Public(公共的) 访问修饰符

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

下面是个小例子

using System;
 
namespace ConsoleApp1
{
    class Rectangle
    {
        public double length { get; set; }
        public double width { get; set; }

        public double Getarea()
        {
            return length * width;
        }

        public void Display()
        {
            Console.WriteLine($"长度:{length}");
            Console.WriteLine($"宽度:{width}");
            Console.WriteLine($"面积:{Getarea()}");
        }
    }




    class Program
    {
        static void Main(string[] args)
        {
            Rectangle rectangle = new Rectangle();
            rectangle.width = 55.5;
            rectangle.length = 12.32;
            rectangle.Getarea();
            rectangle.Display();
            Console.ReadKey(true);
        }
    }
}

 

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

长度:12.32
宽度: 55.5 
面积: 683.76

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

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

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

Private(私有的) 访问修饰符

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

using System;
 
namespace ConsoleApp1
{
    class Rectangle
    {
        private double length { get; set; }
        private double width { get; set; }

        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($"长度:{length}");
            Console.WriteLine($"宽度:{width}");
            Console.WriteLine($"面积:{Getarea()}");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Rectangle rectangle = new Rectangle();
            rectangle.Getarea();
            rectangle.Display();
            Console.ReadKey(true);
        }
    }
}

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


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


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

这一段讲的是private 而不是public 所以请认真看这两个访问修饰符,我第一次看的时候也看错了。所以请认真对待!

Protected 访问修饰符

Protected 访问修饰符允许子类访问它的基类的成员变量和成员函数。这样有助于实现继承。 放到继承的章节详细讨论这个。 

Internal 访问修饰符

Internal 访问说明符允许一个类将其成员变量和成员函数暴露给当前程序中的其他函数和对象。

换句话说,带有 internal 访问修饰符的 任何成员 可以被定义在该成员所定义的应用程序内的任何类或方法访问。 

using System;

namespace RectangleDemo 
{
    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());
        }
    }   
    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 访问修饰符允许在本类,派生类或者包含该类的程序集中访问。这也被用于实现继承。   

版权声明:本文为ZJ-CN原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/ZJ-CN/p/9508496.html

C#面向对象之三大特性: 封装的更多相关文章

  1. [ES4封装教程]3.使用 Easy Sysprep v4 封装 Windows 7

    (一)安装与备份系统 1、安装 Windows 7 可能很多人会说,安装Win7谁不会,这也用说?装Win7的 […]...

  2. 面向对象理解,封装、继承、多态知识总结

    面向对象 类就是对象在程序中的模拟实现,类决定了对象将要拥有的属性和行为 类是一种数据类型,用户自定义的数据类 […]...

  3. [开源] C# 封装 银海医保的接口

    Github 地址: https://github.com/zifeiniu/YinHaiYiBaoCShar […]...

  4. Java知识点梳理——多态

    1、定义:多态是同一个行为具有多个不同表现形式或形态的能力,即一个接口不同的实例执行不同的操作; 2、优点:消 […]...

  5. 小程序封装接口服务请求

    小程序封装服务请求接口使用(main.js)const urlConfig = require('./urlConfig.js');const utilHttp= require('./utilHttp.js'); getWxOpe...

  6. iOS ASIHttpRequest 封装

    ASIHttpRequest 封装 // // HttpUtil.h // AshineDoctor // / […]...

  7. 封装

    封装 Posted on 2019-08-23 16:56 a-leon 阅读(…) 评论( […]...

  8. 【设计模式+原型理解】第三章:javascript五种继承父类方式

    【前言】   我们都知道,面向对象(类)的三大特征:封装、继承、多态   继承:子类继承父类的私有属性和公有方 […]...

随机推荐

  1. 小程序js-api简介及操作

    page({ //小程序当前页面的js代码首先从这里开始执行 onload:function(){ conso […]...

  2. 戴尔R710服务器USC安装linux系统(转载)

    注:此版本dosa支持相应系统为:1、Server 2003 sp2 ; 2、Server 2003 sp2  […]...

  3. .NET开源Bug管理软件BugTracker.NET使用小记

    .NET开源Bug管理软件BugTracker.NET使用小记 2008-01-14 19:31  flyin […]...

  4. JavaSE集合基础总览

    Java集合 Java集合,也称之为容器。基本上你写所有的Java程序,都必须要用到一个包。该API基本都位于 […]...

  5. 星涛:javaEE学习路线一览

    javaEE工程师养成之路 概况 什么是JavaEE工程师? 主要从事java后端API接口开发的的程序员 全 […]...

  6. ASP.NET Core技术研究-探秘Host主机启动过程

    当我们将原有ASP.NET 应用程序升级迁移到ASP.NET Core之后,我们发现代码工程中多了两个类Pro […]...

  7. 多图解释Redis的整数集合intset升级过程

    redis源码分析系列文章 [Redis源码系列]在Liunx安装和常见API  为什么要从Redis源码分析 […]...

  8. 将电脑中的照片传到iphone上

    手机连接电脑, 打开itunes , 在左边设备中选择你的iphone, 右边会出现“摘要” […]...

展开目录

目录导航