【问题标题】:what is the real advantage of encapsulation, and why is it specific to OOP封装的真正优势是什么,为什么它特定于 OOP
【发布时间】:2020-02-02 04:26:04
【问题描述】:

我正在阅读很多关于封装的定义,例如:

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

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

1-那么为什么在同一个单元中组合数据和代码是 OOP 特定的?我想我们甚至可以在非 OOP 编程语言(如 C根据语义)将C中的程序转换为多文件还是将Java中的程序转换为多类?

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

【问题讨论】:

    标签: oop encapsulation


    【解决方案1】:

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

    只有我觉得在 Java 这样的面向对象语言中,程序员通过简单地实现类和对访问施加所需的约束来更容易实现这些原则。在过程编程(例如 C)中,程序员必须努力并遵守编程纪律。掌握这种编写此类 C 程序的技术仍然是一项特殊技能,而实现 OO java 代码则成为遵循特定规则的问题。最后,它将影响市场上可用的技能组合的生产力。

    【讨论】:

      【解决方案2】:

      我开始写这篇文章作为评论,并意识到我遇到了字符数限制。所以我必须把我的评论变成某种准答案

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2011-12-22
        • 2016-10-27
        • 2010-09-06
        • 2011-09-03
        • 2014-04-26
        • 1970-01-01
        • 2010-12-11
        • 1970-01-01
        • 2014-08-03
        相关资源
        最近更新 更多