Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
封装的真正优势是什么?为什么它特定于OOP_Oop_Encapsulation - Fatal编程技术网

封装的真正优势是什么?为什么它特定于OOP

封装的真正优势是什么?为什么它特定于OOP,oop,encapsulation,Oop,Encapsulation,我读了很多关于封装的定义,例如: 封装是将数据和代码绑定在一起形成单个单元的过程 或 它描述了在一个单元内捆绑数据和处理该数据的方法的思想 1-为什么在同一单元中组合数据和代码是面向对象的?我想,即使在非面向对象编程语言(如C)中,我们也可以实现这一点,我们可以将代码和数据分离到多个文件中一个C语言的程序转换成多个文件,还是一个java语言的程序转换成多个类 2-封装的真正好处是什么,我正在寻找一个真实的例子,比较一个用非OOP(C)编写的程序和另一个用OOP语言(java)编写的程序。据我的理

我读了很多关于封装的定义,例如:

封装是将数据和代码绑定在一起形成单个单元的过程

它描述了在一个单元内捆绑数据和处理该数据的方法的思想

1-为什么在同一单元中组合数据和代码是面向对象的?我想,即使在非面向对象编程语言(如C)中,我们也可以实现这一点,我们可以将代码和数据分离到多个文件中一个C语言的程序转换成多个文件,还是一个java语言的程序转换成多个类


2-封装的真正好处是什么,我正在寻找一个真实的例子,比较一个用非OOP(C)编写的程序和另一个用OOP语言(java)编写的程序。

据我的理解,OO的四个原则,即信息隐藏、抽象、封装和继承,我觉得只有继承才是真正的OO特性,这在过程编程中是不容易模拟的。正如您所提到的,其他三个可以通过适当的代码分区来实现


只有我觉得在像Java这样的面向对象语言中,程序员通过简单地实现类并对访问设置所需的约束来实现这些原则更容易。在过程编程(例如C)中,程序员必须在编程过程中付出努力并遵循规程。掌握编写这种C程序的技术仍然是一项特殊技能,因为实现OOJava代码需要遵循特定的规则。最后,它将影响市场上可用技能的生产率

根据我的理解,在OO的四个原则,即信息隐藏、抽象、封装和继承中,我觉得只有继承才是真正的OO特性,这在过程编程中是不容易模拟的。正如您所提到的,其他三个可以通过适当的代码分区来实现


只有我觉得在像Java这样的面向对象语言中,程序员通过简单地实现类并对访问设置所需的约束来实现这些原则更容易。在过程编程(例如C)中,程序员必须在编程过程中付出努力并遵循规程。掌握编写这种C程序的技术仍然是一项特殊技能,因为实现OOJava代码需要遵循特定的规则。最后,它将影响市场上可用技能的生产率

我开始写这篇评论,并意识到我正面临角色限制。所以我必须把我的评论变成某种准答案:

你的问题是个很好的问题,很多书都是为了回答这个问题而写的。简单的回答是,如果您有一个小的编程问题,那么您如何着手寻找解决方案可能并不重要。但问题往往很大。通过将这些大问题分解成更小的问题或片段,最好进行大规模编程。适合自上而下结构编程的C语言建议沿问题域的动词进行分解,也就是说,正在做什么。相反,面向对象编程通过识别问题域中的名词或对象来分解问题。当然,这些物体也表现出行为。希望这些对象在同一领域内出现的其他问题中可以重用

第二种算法可重用性来自面向对象编程。让我们考虑一个具有多种银行账户的银行的简单情况,其中利息根据账户类型以许多不同的方式计算。但不管账户类型如何,很明显,每个月账户余额都会随着该账户当月赚取的利息而增加。所以你可以想象每个月都会发生以下事情:

For each account:
   balance = account.getCurrentBalance()
   interest = account.computeMonthlyInterest()
   newBalance = balance + interest
   account.setBalance(newBalance)

由于多态性和封装,方法
computeMonthlyInterest
将以适合调用该方法的帐户类型的方式计算利息。关键是上面的内容(非常简单)算法对所有帐户类型都适用且可重复使用,并且可以放置在控制器对象中,因为每个帐户类型都知道如何计算自己的兴趣,因此算法不必在每个帐户类型中重复。

我开始将此作为注释编写,并意识到我遇到了角色限制。所以我必须把我的评论变成某种准答案:

你的问题是个很好的问题,很多书都是为了回答这个问题而写的。简单的回答是,如果您有一个小的编程问题,那么您如何着手寻找解决方案可能并不重要。但问题往往很大。通过将这些大问题分解成更小的问题或片段,最好进行大规模编程。适合自上而下结构编程的C语言建议沿问题域的动词进行分解,也就是说,正在做什么。相反,面向对象编程通过识别问题域中的名词或对象来分解问题。当然,这些物体也表现出行为。希望这些对象在同一领域内出现的其他问题中可以重用

第二种算法可重用性来自面向对象编程。让我们考虑一个具有多种银行账户的银行的简单情况,其中利息根据账户类型以许多不同的方式计算。但不管账户类型如何,很明显,每个月账户余额都会随着利息的增加而增加