采访者:什么是封装,以及如何在Java中实现它? Me:封装是一种隐藏客户端信息的机制。 这些信息可能是数据或实现或algorithm。 我们使用访问修饰符来实现这一点。 采访者:这是数据隐藏。 我们如何在Java中实现封装? 我 :ummmmm 具体问题:除了“访问修饰符”,在Java中实现封装的方式是什么?
最近我正在讨论依赖倒置原理 , 控制反转和dependency injection 。 关于这个话题,我们正在辩论这些原则是否违反了OOP的一个支柱,即封装 。 我对这些事情的理解是: 依赖倒置原则意味着对象应该依赖于抽象而不是结核 – 这是实现控制反转模式和dependency injection的基本原理。 控制反转是依赖反转原理的模式实现,其中抽象依赖关系取代具体的依赖关系,允许在对象之外指定依赖关系的结构。 dependency injection是实现控制反转并提供依赖性parsing的devise模式。 当一个依赖被传递给一个依赖的组件时就会发生注入。 实质上,dependency injection模式提供了一种将依赖抽象与具体实现耦合的机制。 封装是高层对象所需要的数据和function被隔离开来并且不可访问的过程,因此程序员不知道如何实现对象。 辩论得到了一个关键点: IoC不是OOP,因为它打破封装 就我个人而言,我认为所有的OOP开发者都应该遵守依存倒置原则和控制倒置的模式,而且我的观点如下: 如果有(可能)不只一个方法去剥皮,那就不要像只有一个。 例1: class Program { void Main() { SkinCatWithKnife skinner = new SkinCatWithKnife (); skinner.SkinTheCat(); } } 这里我们看到一个封装的例子。 程序员只需要调用Main() ,猫就会被剥皮,但是如果他想要剥皮猫,比如说一组锋利的razor呢? 例2: class Program { // Encapsulation ICatSkinner skinner; public Program(ICatSkinner skinner) { // […]
好的,这是窃听我..我知道我已经读过的地方,谷歌没有帮助。 什么是没有指定访问修饰符的方法的可访问性级别? void Foo() { //code } 我想说internal但我不是100%肯定。
在Python中,我有以下示例类: class Foo: self._attr = 0 @property def attr(self): return self._attr @attr.setter def attr(self, value): self._attr = value @attr.deleter def attr(self): del self._attr 正如你所看到的,我有一个简单的“私人”属性“_attr”和一个属性来访问它。 有很多代码来声明一个简单的私有属性,我认为它不尊重“KISS”哲学来声明所有属性。 那么,如果我不需要一个特定的getter / setter / deleter,为什么不把所有的属性声明为公共属性呢? 我的答案是:因为封装原则(OOP)否则说! 什么是最好的方法 ?
我想隐藏intellisense成员列表中的公共方法。 我创build了一个属性,当应用于一个方法将导致该方法被调用时,其对象的构造。 我已经做了这个更好的支持部分类。 问题是,在某些环境(如Silverlight)中,reflection不能访问私有成员,即使是那些子类。 这是一个问题,因为所有的工作都是在基类中完成的。 我必须公开这些方法,但是我希望它们对于智能感知是隐藏的,类似于Obsolete属性的工作方式。 坦率地说,因为我是关于对象封装的肛门。 我尝试了不同的东西,但没有任何实际工作。 该方法仍显示在成员下拉菜单中。 如果我不希望他们被客户打电话,我怎样才能让公开的方法在智能感知中出现? 那真是个问题,非利士人呢! 这也可以适用于必须公开的MEF属性,虽然有时候你想把它们隐藏起来。 更新:自从我发布这个问题以来,我已经成熟了。 为什么我关心隐藏界面是超越我的。
学习面向对象的概念特别有兴趣深入理解抽象和封装。 已经检查了下面 抽象VS信息隐藏VS封装 抽象和封装之间的区别? 我发现很难用真正简单的示例类/代码段来理解这些概念。 我的一位同事说,抽象只不过是创build抽象类和保护其成员variables的普通类,其范围称为封装(Encapsulation)。 有一个简单的方法,我可以理解,并帮助他人了解到底是什么,而不是重复下面? 抽象和封装是相辅相成的概念:抽象的重点在于一个对象的可观察的行为…封装着重于引起这种行为的实现…封装通常是通过信息隐藏实现的,这是隐藏所有对其本质特征没有贡献的对象的秘密。
概要 我试图在JavaScript中正确地实现inheritance和封装,就像使用基于类的语言(如c#)一样。 丑陋的部分是受保护的成员在私人实例中有多个副本,只能通过闭包进行访问,除了将这些成员刷新到私有实例之外,我没有其他想法。 如果可能的话,我想摆脱Function.extend代码中的transmit和transfer 。 故事 由于程序集可能是一个超出javascript范围的概念,我不考虑internal修饰符,但public , protected和private 。 public和private修改者并不难实现; 但是对于inheritance, protected是非常棘手的。 然而,这不是一个推荐的事情,我读过的大多数文章说, 前缀与一个特殊的字符和文件 。 但似乎我坚持让JavaScript来模拟基于类的语言..我偷了这个想法,并以我的方式实现,代码是在这篇文章的后面。 现场背后的想法是把更高的可达性与更高的原型,并访问最高的一个封闭。 假设我们有三个原型A , D和G ,看起来像 因为一个对象不可能是一个不属于原型链的另一种types的实例。 我select的方式是水平链接protected级别,并从声明types的原型复制成员。 这使嵌套类成为可能,因为在派生较less的types上声明的成员可以传播到更多派生types; 在我的代码中的transmit方法是做到这一点。 如果A , D和G拥有自己的受保护成员,则看起来像: 访问私有实例的闭包是this[''] 。 它需要一个用于识别类的参数。 修饰符持有者只是类标识符,在Function.extend名为y ,在testing代码中是_ ,它不应暴露在类声明之外。 它也被用作this['']的快捷键。 _['base']实际上不仅是基础构造函数调用者,而且是私有实例创build者。 它创build私有实例并为每个构造函数更新this['']的inheritance,所以它应该总是在构造函数中调用。 尽pipe一个私有实例可以访问公共成员,但是不应该被用来改变它们,因为this['']在访问公共成员时并不保证被调用。 但是私人实例的访问是; recent记得最近访问的私有实例,如果有变化,更新受保护的成员。 我的问题是,我怎样才能摆脱这种清爽的保护成员? 有更好的想法来实现封装更多的现实? PS:我实际上不想要一个使用非标准方法/属性的解决scheme。如果使用的方法/属性对于旧的浏览器来说太过时尚,它会更好。 Function.extend Function.extend=function (base, factory) { factory.call(initializeClass); updateStaticMembersOfDerivedInnerClasses(y['public'].constructor); transfer(y['protected'], y['public']); return y['public'].constructor; […]
我正在读Kathy Sierra和Bert Bates的SCJP Java 6,这本书让我非常困惑。 在页面245他们声明下面的代码。 Integer i1 = 1000; Integer i2 = 1000; if(i1 != i2) System.out.println("different objects"); //Prints output different objects 然后在下一页他们有以下代码 Integer i3 = 10; Integer i4 = 10; if(i3 == i4) System.out.println("same objects"); //Prints output same objects 我很困惑! 当我自己尝试这个,似乎你不能使用==比较相同的方式,你会使用equals()方法。 即使整数variables设置为相同的值(即10),使用==总是给我“假”。 我对么? 使用==比较相同的Integer对象(具有相同的值)将始终导致“false”
我正在准备采访,并决定刷新我的面向对象的概念。 有数百篇文章,但似乎每个人都有不同的描述。 有人说 抽象是“识别具有系统变化的常见模式的过程;抽象代表了常见模式,并提供了指定使用哪种变化的手段”(Richard Gabriel)。 并通过抽象类来实现。 其他人说 抽象意味着只向对象的客户显示必要的细节 和 假设您的Employee类中有一个“CalculateSalary”方法,它将EmployeeId作为参数,并将当前月份的员工工资作为整数值返回。 现在,如果有人想要使用这种方法。 他不需要关心Employee对象如何计算工资? 他唯一需要关注的是方法的名称,input参数和结果成员的格式, 我一遍又一遍地search,结果似乎没有给我一个正确的答案。 现在,封装在哪里都适合? 我search,发现一个堆栈溢出的问题 。 即使这个问题的答案是混淆在这里 ,它说 封装是一种用作抽象的一部分的策略。 封装是指对象的状态 – 对象封装它们的状态并将其隐藏起来; 类的外部用户通过它的方法与它交互,但不能直接访问类的状态。 所以这个类抽象出与其状态相关的实现细节。 另外一位知名的成员说, 他们是不同的概念。 抽象是细化一个对象的所有不必要/不重要的属性,只保留最适合你的领域的特征的过程。 现在我搞砸了整个概念。 我知道抽象类,inheritance,访问说明符和所有。 我只想知道在面试中被问及抽象和/或封装的时候应该如何回答。 请不要将其标记为重复 。 我知道有几个类似的问题。 但是我想避免相互矛盾的解释之间的混淆。 任何人都可以build议一个可信的链接? 链接到stackoverflow问题也是受欢迎的,除非它再次造成混乱。 🙂 编辑:我需要答案,有点面向c#
为什么不能让所有的方法和属性都可以从任何地方访问? 如果我宣称属性是public你能给我一个我可以遇到的问题的例子吗?