• 封装


    封装:封装是一个面向对象的概念,对外部世界,隐藏类的内部

         在C#中可使用类来达到数据封装的效果,这样就可以使数据与方法封装成单一元素,以便于通过方

    法存取数据。除此之外,还可以控制数据的存取方式。

         面向对象程序设计中一般以类作为数据封装的基本单位。类将数据和操作数据的方法结合成一个单

    位。在设计类时,不希望直接存取类中的数据,而是希望通过方法来存取数据。如此就可以达到封装数据

    的目的,方便以后维护、升级,也可以在操作数据时多一层判断,提高安全性。

         封装还可以解决数据存取权限问题,使用封装可以将数据隐藏起来,形成一个封闭的空间,用户可

    以设置哪些数据只能在这个空间中使用,哪些数据可以在空间外部使用。如果一个类中包含敏感数据,则

    有些用户可以访问,有些用户却不能访问。如果不对这些数据的访问加以限制,那么后果是很严重的。所

    以,在编写程序时,要对类的成员使用不同的访问修饰符,从而定义它们的访问级别。

    关于封装的理解:

    封装是动词,类就是一种封装。我们可以把属性封装,也可以把方法封装。封装是面向对象一个重要的特性。控制在程序中属性的读取和修改的访问级别。我们定一个了一个属性,
    可以是公共属性,也可以是私有属性。当我们设置私有属性的时候,就只有类自己能进行访问和操作。使用get和set的作用就是把属性变得可以对外公开接口。get和set只是封
    装的一种方式而已,并不是唯一方式。对一些需要外部访问的属性,又要避免直接操作引来的一些安全隐患和逻辑混乱,通常用get和set来设置。get和set实际上是所有对象的
    基类中的一个公共的方法,实际上你不用get和set自己写一个方式也可以达到封装的效果。但是比较麻烦,所以既然基类中提供了这种方法,为什么不用呢。get和set有点像
    this的概念,谁也没规定this就是一定要有的,但是为了编程方便。this经常使用。

    封装优点:

    1.好的封装能减少耦合

    2.类的内部的实现可以自由改变 

    3.一个类有更清楚的接口

    Data Hiding(

    数据隐藏

    ):

    封装的一个最有用的形式是数据隐藏

    一个类的数据表现一个对象的状态

    修饰符支持封装:

    Private:

    只有类本身能存取

    Protected:

    类和派生类可以存取

    Internal:

    只有同一个项目中的类可以存取

    Protected Internal:是Protected和Internal的结合

    Public:

    完全存取

    other 

    Encapsulating 

    Strategy:(

    其他封装策略

    )

    属性和索引器的目的是封装一个类的细节和给类的用

    户提供一个公共的接口

    封装和继承的关系:

    封装的意思是包容(聚合),类与类之间的关系是"has a".一个类里面有另一个类

    继承,类与类之间的关系是"is a". 

        面向对象思想有三个核心要素:封装、继承与多态。如能正确理解这三要素,那么基本上可以算是在编程中建立了面向对象思想。在第二节中我曾介绍,在C#中,所有数据类型的实例都是“对

    象”,不过最能体现对象特质的类型,还是“类”,同时它也是C#中最重要、最频繁使用的类型。接下来,我将通过介绍 C#的类,来充分理解对象封装的概念。所谓“对象”,形象地说,

    我们可以把它理解为一块积木。设计积木的人需要设计积木的外观与形状,还有内部的材质。堆积木的人对于内部的材质并不关心,他们只需要根据不同的外观与形状来决定堆放的位置。因此,对于开发者而言,要设计面向对象的程序,同时会是两个迥然不同

    的身份:设计者与使用者。

         先谈谈使用者。使用者的身份,就是利用已经提供给你的所有对象,根据需求,设计出自己需要实现的程序。就如堆积木的过程。这恰恰是面向对象编程的优势所在,那就是“对象的重用”。已经设计好的对象,可以被不同的使用者调用,这些功能既然已经实现,

    对于使用者而言,当然就免去了自己去设计的过程。正如堆积木那样,既然有了现成设计好的积木,使用者所要做的工作就是把这些积木最后组合起来,堆成不同的形状。.Net Framework

    所提供的类库,就是这样的积木。

    例如我们想把一个int类型转换成字符型,就没有必要自己去实现这种转换,直接调用.Net Framework提供的功能就可以了:int i = 10; string s = i.ToString();  

    再比如我们想弹出一个

    Windows

    消息框,同样可以直接使用

    .Net Framework

    现有的类库:

     

    MessageBox.Show(“Message”);

     

     

    在上述的例子中,

    i

    MessageBox

    都是一个对象。

     

     

    再谈谈设计者的身份。虽然

    .Net Framework

    的类库功能已经非常强大,但它不可能考虑到业务

    的方方面面,

    如果需要使用一个根本就不存在的对象,

    此时就需要自己来设计了。

    例如图书管理

    系统,可能就需要用户,图书等对象。这就需要开发者自己来设计这些对象。

     

     

    既然最能体现“对象”思想的类型是“类”,我就来介绍一下

    C#

    中的类类型。

    C#

    中类的关键字

    class

    在一个

    class

    对象中,

    主要分为

     field

    (字段)

    property

    (属性)

    method

    (方法)

    前面两个对应的是对象的属性,

    method

    则对应对象的行为。

    一个典型的

     class

    定义如下所示:

     

    public class User 

     private string m_name; 

     private string m_password; 

     private int m_tryCounter; 

     public string Name 

     { 

      get {return m_name;} 

      set {m_name = value;} 

     } 

     public string Password 

     {  

      get {return m_password;} 

      set {m_password = value;} 

     } 

     public void SignIn() 

     {   

      if (m_tryCounter < 3) 

      { 

       if (IsValid()) 

       {   

        m_tryCounter = 0; 

        Console.WriteLine("User {0} was signed in.", m_name); 

       } 

       else 

       { 

        m_tryCounter++; 

        Console.WriteLine("User {0} is invalid. 

    Can’t Sign in.", m_name);

     

       } 

      } 

      else 

      { 

       Console.WriteLine("You try to sign in more than 3 times. You are be denied."); 

      } 

     } 

     public void SignOut() 

     { 

      m_tryCounter = 0; 

      Console.WriteLine("User {0} was signed out.", m_name); 

     }  

     private bool IsValid() 

     { 

      if (m_name.ToUpper() == "ADMIN" && m_password == "admin") 

      { 

       return true; 

      } 

      else 

      { 

       return false; 

      } 

     } 

     

    字符串

    m_name

    m_password

    m_tryCounter

    就是类

    User

    的字段,

    Name

    Password

    是类

    User

     
     
     
    要么生,要么死
  • 相关阅读:
    Cannot assign requested address问题总结
    Trying to connect an http1.x server
    从 0 到 1 搭建技术中台之推送平台实践:高吞吐、低延迟、多业务隔离的设计与实现
    思考gRPC :为什么是HTTP/2
    HTTP/1HTTP/2HTTP/3
    get_or_create update_or_create
    死锁案例 GAP 锁 没有就插入,存在就更新
    死锁产生必要条件
    京东零售mockRpc实践
    Certbot CA 证书 https
  • 原文地址:https://www.cnblogs.com/llljpf/p/6773336.html
Copyright © 2020-2023  润新知