poi*_*ics 44 oop encapsulation
我知道这是oops中一个非常基本的概念.但我仍然无法理解.我理解为什么成员变量是私有的,因此类用户不能通过设置无效值来滥用它.
但这怎么能适用于这些方法呢?
trz*_*zek 97
很多很好的答案,但也许还有一个来自自学成才的Java程序员,因为我经历了很多痛苦的事情;)
把一个班级想象成从外面看到的东西,而不是你在内部看到的东西.如果你从外面看一个班级,你看到了什么?
以时钟为例,时钟可以为您提供有关当前时间的信息,并且可以设置为显示正确的时间.
所以从外面看东西,时钟就是可以做这两件事的机器; 我们称之为公共方法.
但我们作为这个时钟的构造者,我们知道在任何时间操作之前我们必须在显示器上从23切换到11(这是那种时钟),所以我们必须在内部重新安排一些事情.在这两种情况下,从23变为11对我们来说都很合适 - 设置时钟并显示当前时间 - 但我们"在侧面"这样做,因为用户不必知道所有复杂的数学.这些是私人方法!
因此,我们的Clock
类可以有两个公共方法(showTime
和setTime
),它们都是用户想要查看的,以及一个私有方法(recountTime
),它为这些公共方法提供功能,并且是用户不希望看到的.
所以一方面,你应该记住私有是未来程序员使用你的代码不会重新实现和访问的(正如上面的答案所指出的那样).但私有也意味着一边做的事情,所以用户不会看到它.这就是为什么我们将公共方法称为公共接口 - 所有用户都会从外部看到它.
对我来说,有用(我自学成才,所以也许这不是一种非常流行的方法......)写下用户(真实用户和其他类)将对我的类做的所有事情(只有公共方法的公共接口) '签名),然后编写私有方法的签名,我实施者将用它来完成承诺提供给我的用户的公共目标,然后用代码实现它.
记住旧的C规则仍然有效(如每个程序员应该知道的97件事所表达的那样)是有帮助的:一个函数/方法应该只有几行,真的!
uck*_*man 28
私有方法可用于将任务分解为较小的部分,或用于防止类中其他方法经常需要的代码重复,但不应在该类之外调用.
dke*_*ner 10
整个问题是其他人无法表现。让我解释。
在一个完美的世界中,你不会通过向他人“隐藏”东西来获得任何东西,你可以公开你所有的方法,告诉他们使用哪些方法,然后去享受乐趣。但迟早有人会依赖你编写的方法,假设一个方法是内部的,仅供你使用,一些你期望能够随时更改的低级内容 - 唉,现在你不能,因为别人正在依赖它。你改变了它,其他东西就坏了。没有明显的原因。因为有人没有按照您的建议使用您的类,所以有人调用了您的内部方法,并且您改进了代码中的某些内容。
所以最短的要点是:
隐藏方法是保留更改它们的权利。
公共接口不应更改,除非这是一个重大步骤,例如新版本。但内部世界是你的游乐场。不管你如何完成事情,只要你交付了预期的产出,这与其他人无关。
所以将方法设为私有的最大原因是你自己的自由。有些人会说这是出于“安全”原因,但现在您的代码通常是可见/可编辑的,因此显然我们在这里不讨论访问级别。是有的,但是不建议使用。这就是private(和protected)的含义。
方法(也)用于构造代码,我不希望我的实现的内部结构通过接口泄漏.通常我有一种方法,它对外部似乎只做一个任务,但实际上必须执行几个较小的任务.在这种情况下,我为每个子任务创建一个小的私有方法,并从公开可见的方法中调用它们.