我对封装的概念和实现有问题。
有人可以向我解释一下吗?
答案 0 :(得分:11)
封装是一个适度简单的概念,一旦你意识到它(可能)来自与胶囊相同的基础词。
这只是对信息的遏制。
封装意味着一个类只发布其他人使用它所需的内容,而不再发布。这称为信息隐藏,它意味着类可以完全改变其内部,而不会对其任何用户产生影响。
换句话说,一个字典类可以作为一个简单的数组开始生活,然后进入二进制文本树,甚至可能进入某些数据库访问函数,所有这些都不会改变它的接口。
在面向对象的世界中,对象既包含数据,也包含用于操作数据的方法,这是封装的顶峰。这样做的一种方法是确保每个对象知道要调用哪些函数来操纵其数据,并确保调用正确的函数。
作为一个例子,这里有一个用于在我的神话中维护整数列表的类,但奇怪的是Pythonic,因此很容易理解,语言:
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
FILE*
内容就是一个很好的例子。你没有关心指针实际上是什么,因为所有使用它的函数都知道如何做它们的东西。
答案 1 :(得分:8)
我总是向人们解释它是把自己想象成一个对象。其他人可以看到你的身高,他们可以看到你的微笑,但你内心的想法,也许是你微笑的原因,只有你知道。
答案 2 :(得分:3)
封装 - 以单个单位包装数据。我们也可以说隐藏重要细节的信息。 例 你有一部手机....有一些界面可以帮助你与手机互动,你可以使用手机的服务。但实际上在手机上工作是隐藏的。你不知道它是如何在内部运作的。
隐藏/绑定某物:例如:胶囊(我们在生病时消耗)隐藏/粘合一些粉末形式,意味着胶囊包裹着它的粉末。
绑定数据和行为,即以安全和受控方式处理对象的功能。
或封装的最佳示例是CLASS,因为类隐藏了来自外部类的类变量/函数。
封装: 将数据成员和方法一起包装到单个单元(即Class)中称为Encapsulation。
例如:我们可以考虑一个胶囊。封装意味着隐藏对象的内部细节,即对象如何做某事。这里胶囊是一个包含很多东西的单位。但我们无法看到侧胶囊中有什么。
这是用于保护与其他对象有关的对象信息的技术。像变量一样,我们可以将私有和属性设置为Public。当我们访问该属性时,我们验证并设置它。
我们可以通过其他一些例子。笔记本电脑。我们可以使用笔记本电脑,但我们不知道的内部正在发生什么操作。但我们可以使用它。与手机,电视等相同。
我们可以得出结论,一组相关的属性,方法和其他成员被视为单个单元或对象。封装对象通常称为抽象数据类型。
还有其他几种方法可以使用封装,例如我们可以使用接口。该接口可用于隐藏已实现类的信息。
//声明为私人
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;
}
}
注意:封装提供了一种保护数据免遭意外损坏的方法。
谢谢
答案 3 :(得分:1)
封装不仅仅是为类定义accessor和mutator方法。面向对象编程的更广泛概念在于最小化类之间的相互依赖性,通常通过信息隐藏来实现。
封装之美是在不影响用户的情况下改变事物的力量。
在像Java这样的面向对象编程语言中,您可以通过使用辅助功能修饰符隐藏细节来实现封装(public,protected,private,以及不暗示包私有的修饰符)。通过这些级别的可访问性,您可以控制封装级别,级别限制越少,发生更改的代价越高,类与其他依赖类(即用户类,子类)的耦合程度越高。
因此,目标不是隐藏数据本身,而是隐藏有关如何操作此数据的实现细节。
我们的想法是提供一个公共接口,通过它您可以访问这些数据。您可以稍后更改数据的内部表示,而不会影响类的公共接口。相反,通过暴露数据本身,您可以破坏封装,从而改变操作数据的方式而不影响其用户的能力。您可以使用数据本身创建依赖项,而不是使用类的公共接口创建依赖项。当"改变"你会创造一个完美的鸡尾酒来解决问题。终于找到了你。
您可能希望封装对字段的访问权限有几个原因。 Joshua Bloch在他的“有效Java”一书中,第14项:尽量减少课程和成员的可访问性,提到了几个令人信服的理由,我在这里引用:
您可以限制可以存储在字段中的值(即性别必须为F或M)。 您可以在修改字段时执行操作(触发事件,验证等)。 您可以通过同步方法来提供线程安全性。 您可以切换到新的数据表示(即计算字段,不同数据类型) 但是,封装不仅仅是隐藏字段。在Java中,您可以隐藏整个类,从而隐藏整个API的实现细节。例如,在Arrays.asList()方法中考虑一下。它返回一个List实现,但你不关心哪个实现,只要它满足List接口,对吧?可以在将来更改实现,而不会影响方法的用户。
封装之美
现在,在我看来,要真正理解封装,首先必须理解抽象。
例如,考虑一下汽车概念的抽象层次。汽车内部实施复杂。它们有几个子系统,如传动系统,断路系统,燃油系统等。
然而,我们已经简化了它的抽象,我们通过它们的抽象的公共接口与世界上的所有汽车进行交互。我们知道所有的汽车都有一个方向盘,我们通过它来控制方向,他们有一个踏板,当你按下它时,你加速汽车和控制速度,另一个,当你按下它,你让它停止,你有一个齿轮如果你前进或后退,你可以控制它。这些特征构成了汽车抽象的公共界面。早上你可以驾驶一辆轿车,然后下车并在下午驾驶一辆SUV,好像它是一样的。
但是,我们很少有人知道所有这些功能如何在幕后实现的细节。想想汽车没有液压定向系统的时间。有一天,汽车制造商发明了它,并决定将它从那里放入汽车。尽管如此,这并没有改变用户与他们交互的方式。用户最多使用定向系统。这样的改变是可能的,因为汽车的内部实现是封装的。可以安全地完成更改,而不会影响其公共接口。
现在,我认为汽车制造商决定将燃油盖放在汽车下方,而不是在其中一侧。你去购买这些新车中的一辆,当你用完汽油时,你会去加油站,而你却找不到加油盖。突然你意识到是在汽车下面,但你无法用气泵软管到达它。现在,我们打破了公共接口合同,因此,整个世界都破裂了,它因为事情没有按照预期的方式运转而崩溃。这样的改变会花费数百万美元。我们需要改变世界上所有的气泵。当我们打破封装时,我们必须付出代价。
因此,正如您所看到的,封装的目标是最小化相互依赖性并促进变革。您可以通过最小化实现细节的曝光来最大化封装。只能通过公共接口访问类的状态。
我真的建议你阅读Alan Snyder在面向对象编程语言中称为封装和继承的论文。此链接指向ACM上的原始论文,但我相信您将能够通过Google找到PDF副本。
答案 4 :(得分:0)
封装意味着隐藏数据。换句话说,类只暴露那些被授权可见的属性或信息。请考虑下面的例子,其中名为ConfidentialMessage的特定属性只能访问Admin角色。此属性为私有属性,并通过另一种方法返回,该方法检查用户的角色并仅为admin返回消息。
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;
}
}
答案 5 :(得分:0)
用“ make,put in” +胶囊+ -ate封装在胶囊中。
现在胶囊的意思是盒子,箱子
在现实生活中,如果您将东西放在桌子上打开,那么任何人都可以使用它,但是如果您放了箱子,则可以通过打开箱子的钥匙来访问它。 如果您创建变量,则在类中的用法相同,则只要您创建该类的对象就可以访问它。但是,如果创建用于访问变量的函数,则已经创建了大小写,而函数是访问变量的关键。
因此,在编程语言中,我们通过使用getter和setter并将其设置为私有变量来创建数据包装器。
答案 6 :(得分:0)
封装是一个封装,请视为封装或隐藏字段,属性和函数的类。
请检查以下内容,以简单的编程示例简化url封装。
http://itsforlavanya.blogspot.com/2020/08/encapsulation.html?m=1