Encapsulation 封装概念

Encapsulation 封装概念,encapsulation,Encapsulation,我对封装的概念和实现有问题 有人能给我解释一下吗?一旦你意识到它(可能)和capsule来自同一个基本单词,封装是一个相当简单的概念 它只是一个信息的容器 封装意味着一个类只发布其他人使用它所需的内容,而不再发布。这就是所谓的信息隐藏,它意味着类可以完全改变它们的内部结构,而不会对任何用户产生影响 换句话说,dictionary类可以从一个简单的数组开始,然后发展到一个单词的二叉树,甚至可以发展到一些数据库访问函数,所有这些都不需要改变它的接口 在面向对象的世界中,对象同时持有其数据和用于操作数

我对封装的概念和实现有问题


有人能给我解释一下吗?

一旦你意识到它(可能)和capsule来自同一个基本单词,封装是一个相当简单的概念

它只是一个信息的容器

封装意味着一个类只发布其他人使用它所需的内容,而不再发布。这就是所谓的信息隐藏,它意味着类可以完全改变它们的内部结构,而不会对任何用户产生影响

换句话说,dictionary类可以从一个简单的数组开始,然后发展到一个单词的二叉树,甚至可以发展到一些数据库访问函数,所有这些都不需要改变它的接口

在面向对象的世界中,对象同时持有其数据和用于操作数据的方法,这是封装的顶峰。一种方法是确保每个对象都知道要调用哪些函数来操作其数据,并确保调用了正确的函数

作为一个例子,这里有一个类用于在我神秘但奇怪的python语言中维护整数列表,因此希望易于理解:

class intlist:
    private int val[10]
    private bool used[10]
    public constructor:
        for i in 0..9:
            used[i] = false

    public function add (int v):
        for i in 0..9:
            if not used[i]:
                used[i] = true
                val[i] = v
                return
        throw intlist-full

    public function del (int v):
        for i in 0..9:
            if used[i] and val[i] == v:
                used[i] = false
                return
        throw intlist-invalid-value
现在这里发布的唯一信息是构造函数和两个用于添加和删除的函数

因为其他所有东西都是封装的,所以我可以随意更改它,而不会破坏使用它的代码

我可以使数组变长,我可以将它们排序或存储在二叉树中,而不是数组中,以使其更快。只要发布的API不变,我就可以自由地做我想做的事情。事实上,我也可以在不破坏其他代码的情况下向API添加内容,我只是不能删除或更改他们所依赖的任何内容


您应该注意到,封装对于面向对象并不是什么新鲜事。在C语言中,通过确保信息隐藏在模块(通常是带有私有头的源文件或源文件组)中,这种方法已经存在了很长时间

事实上,
stdio.h
文件*
就是一个很好的例子。您不必关心指针后面的实际内容,因为所有使用它的函数都知道如何完成它们的工作。


我总是向人们解释,把自己当作一个物体。其他人可以看到你的身高,他们可以看到你是否微笑,但你内心的想法,也许是你微笑的原因,只有你知道。

封装-将数据封装在单个单元中。我们也可以说隐藏了重要细节的信息。 例子 你有一部手机。。。。那里有一些界面,帮助你与手机互动,你可以使用手机的服务。但实际上在手机里工作是隐藏的。你不知道它内部是如何工作的

隐藏/绑定某物:例如:胶囊(我们生病时食用)本身隐藏/绑定某种粉末形式,意味着胶囊封装了所含粉末

数据和行为的绑定即以安全和受控的方式绑定对象的功能

或者最好的封装示例是类,因为类从d类外部隐藏类变量/函数

封装: 将数据成员和方法包装到单个单元(即类)中称为封装

我们可以考虑胶囊。封装意味着隐藏对象的内部细节,即对象如何做某事。这里的胶囊是一个单独的单元,包含许多东西。但我们看不到侧舱里有什么

这是一种用于保护对象信息不受其他对象影响的技术。和变量一样,我们可以将属性设置为私有,将属性设置为公共。当我们访问属性时,我们验证并设置它

我们可以看一些其他的例子。我们的笔记本电脑。我们可以使用笔记本电脑,但我们不知道里面发生了什么操作。但我们可以利用它。和手机、电视等一样

我们可以得出结论,一组相关的属性、方法和其他成员被视为单个单元或对象。封装的对象通常称为抽象数据类型

还有其他几种方法可以使用封装,例如我们可以使用接口。该接口可用于隐藏已实现类的信息

//宣布为私人

   private string _LegName;
//属性集为公共

public string LegName
 {
  get
  {
    return _LegName;
  }
  set
  {
    _LegName=value;
  }

 public class LegMain
 {
   public static int Main(string[] args)
   {
    Leg L= new Leg();
    d.LegName="Right Leg";
    Console.WriteLine("The Legis :{0}",d.LegName);return 0;
   }  
  }
注意:封装提供了一种防止数据意外损坏的方法


谢谢

封装不仅仅是为类定义访问器和变异器方法。它是一个更广泛的面向对象编程概念,包括最小化类之间的相互依赖性,并且通常通过信息隐藏来实现

封装的美妙之处在于在不影响用户的情况下改变事物的能力

在像Java这样的面向对象编程语言中,您可以通过使用可访问性修饰符(public、protected、private和no修饰符,这意味着包私有)隐藏细节来实现封装。通过这些可访问性级别,您可以控制封装级别,级别限制越少,发生更改时的成本就越高,并且类与其他依赖类(即用户类、子类)的耦合程度就越高

因此,目标不是隐藏数据本身,而是关于如何操作数据的实现细节

我们的想法是提供一个公共接口,通过它您可以访问这些数据。以后可以在不影响类的公共接口的情况下更改数据的内部表示形式。相反,通过公开数据本身,您损害了封装,从而影响了在不影响用户的情况下更改数据操作方式的能力。可以使用数据本身而不是类的公共接口创建依赖项。你会为你的孩子们准备一杯完美的鸡尾酒
    public class Message
    {
        public Message()
        {
            ConfidentialMessage = "I am Nemo";
        }
        private string ConfidentialMessage { get; set; }
        public string GetMessage(string name)
        {
            string message = string.Empty;
            if (name == "Admin")
            {
                message = this.ConfidentialMessage;
            }
            return message;
        }
    }