Questions tagged «encapsulation»

在OOP中,一种用于限制对某些对象组件的访问的机制或一种设计原则,鼓励与实现细节的分离。


12
为什么Python的“私有”方法实际上不是私有的?
Python使我们能够在类中创建“私有”方法和变量,方法是在名称前加上双下划线,例如:__myPrivateMethod()。那么,如何解释这一点 >>> class MyClass: ... def myPublicMethod(self): ... print 'public method' ... def __myPrivateMethod(self): ... print 'this is private!!' ... >>> obj = MyClass() >>> obj.myPublicMethod() public method >>> obj.__myPrivateMethod() Traceback (most recent call last): File "", line 1, in AttributeError: MyClass instance has no attribute '__myPrivateMethod' >>> dir(obj) ['_MyClass__myPrivateMethod', …

30
什么时候应该在C ++中使用“朋友”?
我一直在阅读C ++常见问题解答,并对friend声明感到好奇。我个人从未使用过它,但是我对探索这种语言很感兴趣。 使用的一个好例子是friend什么? 再读一遍FAQ,我喜欢<< >>运算符重载的想法,并添加为这些类的朋友。但是我不确定这不会破坏封装。这些例外什么时候可以保持在OOP的严格程度之内?
354 c++  oop  encapsulation  friend 


4
了解__getattr__和__getattribute__之间的区别
我试图理解上的差异之间__getattr__和__getattribute__,但是,我在它失败。 堆栈溢出问题的答案与vs 之间的区别是__getattr____getattribute__: __getattribute__在查看对象的实际属性之前调用,因此很难正确实现。您可以非常轻松地进行无限递归。 我完全不知道那是什么意思。 然后继续说: 您几乎可以肯定想要__getattr__。 为什么? 我读到,如果__getattribute__失败,__getattr__则称为。那么,为什么有两种不同的方法做同样的事情呢?如果我的代码实现了新样式类,我应该使用什么? 我正在寻找一些代码示例来清除此问题。我已尽我所能搜索Google,但是我发现的答案并未彻底讨论该问题。 如果有任何文档,我准备阅读。


9
我应该返回收藏集还是流?
假设我有一个将只读视图返回到成员列表的方法: class Team { private List < Player > players = new ArrayList < > (); // ... public List < Player > getPlayers() { return Collections.unmodifiableList(players); } } 进一步假设所有客户要做的就是立即遍历列表一次。也许将播放器放入JList之类。客户端就不能存储到列表的引用以便稍后进行检查! 在这种常见情况下,我应该返回流吗? public Stream < Player > getPlayers() { return players.stream(); } 还是在Java中返回流非惯用语?流是否设计为始终在创建它们的相同表达式内被“终止”?

9
Java:子包可见性?
我的项目中有两个软件包:odp.proj和odp.proj.test。我希望某些方法仅对这两个软件包中的类可见。我怎样才能做到这一点? 编辑:如果在Java中没有子包的概念,有没有解决的办法?我有某些方法只想供测试人员和该软件包的其他成员使用。我应该把所有东西都放进同一个包装吗?使用广泛的反思?


7
使用策略模式和命令模式
两种设计模式都封装了一种算法,并将实现细节与调用类分离。我可以辨别的唯一区别是,策略模式采用了执行参数,而命令模式则没有。 在我看来,命令模式需要所有信息才能在创建时可用,并且能够延迟其调用(也许是脚本的一部分)。 哪些决定指导使用一种模式还是另一种模式?

24
封装Integer.parseInt()的好方法
我有一个项目,我们经常在其中Integer.parseInt()将String转换为int。当出现问题时(例如,String不是数字,而是字母a或其他),此方法将引发异常。但是,如果我到处都必须处理代码中的异常,这很快就会非常难看。我想将其放在一个方法中,但是,我不知道如何返回一个干净的值以表明转换出错。 在C ++中,我可以创建一个方法,该方法接受一个指向int的指针,并让该方法本身返回true或false。但是,据我所知,这在Java中是不可能的。我也可以创建一个包含true / false变量和转换后的值的对象,但这似乎也不理想。全局值也一样,这可能会给我带来多线程问题。 那么有没有一种干净的方法可以做到这一点?

15
封装与抽象之间的区别
我今天接受了采访。我对OOP提出了一个问题,关于封装和抽象之间的区别? 我回答了她,据我所知,封装基本上是将数据成员和成员函数绑定到称为Class的单个单元中。而抽象基本上是隐藏实现的复杂性并为用户提供方便的访问。我以为她可以接受我的回答。但是她询问,如果两者的目的都是隐藏信息,那么两者之间的实际区别是什么?我不能给她任何答案。 在问这个问题之前,我阅读了StackOverFlow上有关这两个OOP概念之间的区别的其他线程。但是我没有找到说服面试官的能力。 任何人都可以用最简单的例子来证明它的合理性吗?

13
抽象和封装有何不同?
我正在准备面试,并决定重新整理我的OOP概念。有数百篇文章可用,但似乎每个文章对它们的描述都不相同。 有人说 抽象是“识别具有系统变异的通用模式的过程;抽象表示通用模式,并提供了一种指定使用哪种变异的方法”(Richard Gabriel)。 并通过抽象类实现。 一些其他的说 抽象意味着只向对象的客户显示必要的细节 和 假设您的Employee类中有一个方法“ CalculateSalary”,该方法将EmployeeId作为参数,并以整数值返回当月员工的薪水。现在,如果有人想使用该方法。他不需要关心Employee对象如何计算薪水?他唯一需要关注的是方法的名称,其输入参数和所得成员的格式, 我一次又一次地搜索,结果似乎都没有给我一个正确的答案。 现在,封装在所有这些方面适合什么地方? 我搜索并发现了堆栈溢出问题。它说,即使是这些问题的答案也使这里感到困惑。 封装是用作抽象的一部分的策略。封装是指对象的状态-对象将其状态封装起来并从外部隐藏起来;类的外部用户通过其方法与之交互,但无法直接访问类的状态。因此,该类将与状态相关的实现细节抽象出来。 而这里的另一个知名的成员说, 它们是不同的概念。 抽象是完善对象的所有不需要/不重要属性并仅保留最适合您的域的特征的过程。 现在我把整个概念弄糊涂了。我了解抽象类,继承,访问说明符以及所有内容。我只想知道在面试中被问到抽象和/或封装时应该如何回答。 请不要将其标记为重复项。我知道有几个类似的问题。但是,我想避免相互矛盾的解释之间的混淆。谁能建议一个可靠的链接?也欢迎使用stackoverflow问题的链接,除非它再次造成混乱。:) 编辑:我需要答案,有点面向C#

5
IEnumerable与IReadonlyCollection与ReadonlyCollection用于公开列表成员
我花了好几个小时思考一下暴露名单成员的话题。在与我类似的问题中,乔恩·斯基特(Jon Skeet)给出了一个很好的答案。请随时查看。 ReadOnlyCollection或IEnumerable用于公开成员集合? 我通常对公开列表非常偏执,尤其是在开发API时。 我一直使用IEnumerable公开列表​​,因为它非常安全,并且具有很大的灵活性。让我在这里使用示例: public class Activity { private readonly IList<WorkItem> workItems = new List<WorkItem>(); public string Name { get; set; } public IEnumerable<WorkItem> WorkItems { get { return this.workItems; } } public void AddWorkItem(WorkItem workItem) { this.workItems.Add(workItem); } } 任何针对IEnumerable进行编码的人在这里都是非常安全的。如果以后我决定使用有序列表或其他东西,它们的代码都不会中断,而且还是不错的。IEnumerable的缺点是可以将其强制转换回此类之外的列表。 因此,许多开发人员使用ReadOnlyCollection公开成员。这是非常安全的,因为它永远都不能返回列表。对我来说,我更喜欢IEnumerable,因为它提供了更多的灵活性,如果我想实现不同于列表的东西的话。 我提出了一个我更喜欢的新主意。使用IReadOnlyCollection: public class Activity { private readonly …

16
了解封装和抽象的简单方法
学习特别感兴趣的OOP概念,以深入了解抽象和封装。 已经检查了以下内容 抽象VS信息隐藏VS封装 和封装之间的区别? 我发现很难用一个真实而简单的示例类/代码片段来理解这些概念。 我的一位同事说,抽象只不过是创建抽象类和使用范围保护其成员变量的普通类,称为封装。 有没有一种简单的方法可以使我理解并帮助他人了解他们的确切身份,而不是重复以下内容? 抽象和封装是互补的概念:抽象集中于对象的可观察行为...封装着重于引起这种行为的实现...封装通常是通过信息隐藏来实现的,信息隐藏是隐藏所有对象的过程。对物体的本质没有帮助的秘密。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.