Questions tagged «oop»

面向对象的编程是一种使用“对象”的编程范式:由数据字段和方法及其相互作用组成的数据结构。

10
如何防止在班级中修改私有字段?
想象一下我有这堂课: public class Test { private String[] arr = new String[]{"1","2"}; public String[] getArr() { return arr; } } 现在,我有另一个使用上述类的类: Test test = new Test(); test.getArr()[0] ="some value!"; //!!! 这就是问题所在:我已经从外部访问了班级的私有领域!我该如何预防?我的意思是如何使该数组不可变?这是否意味着您可以使用每种获取方法来逐步访问私有字段?(我不需要像Guava这样的任何库。我只需要知道执行此操作的正确方法)。
165 java  arrays  oop  class 

11
在实践中真的使用了pImpl成语吗?
我正在阅读Herb Sutter撰写的“ Exceptional C ++”一书,在那本书中,我了解了pImpl习惯用法。基本上,该想法是为a的private对象创建一个结构class并动态分配它们以减少编译时间(并以更好的方式隐藏私有实现)。 例如: class X { private: C c; D d; } ; 可以更改为: class X { private: struct XImpl; XImpl* pImpl; }; 以及在CPP中的定义: struct X::XImpl { C c; D d; }; 这似乎很有趣,但是我以前从未见过这种方法,无论是在我工作的公司还是在看过源代码的开源项目中,我都从未见过。因此,我想知道这种技术是否真的在实践中使用? 我应该在任何地方使用它还是要谨慎使用?是否建议将此技术用于性能非常重要的嵌入式系统?
165 c++  oop  pimpl-idiom 


8
遍历python中的对象属性
我有一个带有几个属性和方法的python对象。我想遍历对象属性。 class my_python_obj(object): attr1='a' attr2='b' attr3='c' def method1(self, etc, etc): #Statements 我想生成一个包含所有对象属性及其当前值的字典,但是我想以一种动态的方式进行操作(因此,如果以后添加另一个属性,我也不必记住要更新我的函数)。 在php中,变量可以用作键,但是python中的对象是不可写的,如果我为此使用点符号,则会创建一个新属性,其名称为var,这不是我的意图。 为了使事情更清楚: def to_dict(self): '''this is what I already have''' d={} d["attr1"]= self.attr1 d["attr2"]= self.attr2 d["attr3"]= self.attr3 return d · def to_dict(self): '''this is what I want to do''' d={} for v in my_python_obj.attributes: d[v] = self.v return …

17
除了拥有正确的方法之外,接口还有更多其他功能
所以可以说我有这个界面: public interface IBox { public void setSize(int size); public int getSize(); public int getArea(); //...and so on } 我有一个实现它的类: public class Rectangle implements IBox { private int size; //Methods here } 如果我想使用接口IBox,则实际上无法通过以下方式创建它的实例: public static void main(String args[]) { Ibox myBox=new Ibox(); } 对?所以我实际上必须这样做: public static void main(String args[]) { …

9
函数式和命令式编程语言之间有什么区别?
大多数主流语言,包括诸如C#,Visual Basic,C ++和Java之类的面向对象编程(OOP)语言,都被设计为主要支持命令式(过程式)编程,而类似Haskell / gofer的语言纯粹是功能性的。谁能详细说明这两种编程方式之间的区别? 我知道选择编程方式取决于用户要求,但是为什么建议学习功能性编程语言呢?

22
C语言中的面向对象
什么是一组能使C语言实现某种丑陋(但可用)的面向对象的漂亮的预处理程序黑客(与ANSI C89 / ISO C90兼容)? 我熟悉几种不同的面向对象语言,因此请不要回答“学习C ++!”之类的答案。我已经阅读了“ 使用ANSI C进行面向对象的编程 ”(当心:PDF格式)和其他一些有趣的解决方案,但是我对您的最感兴趣:-)! 另请参见您可以用C编写面向对象的代码吗?
157 c  oop  object 

8
如何在javascript中从子类调用父方法?
我花了最后几个小时试图找到解决我问题的方法,但这似乎是没有希望的。 基本上,我需要知道如何从子类中调用父方法。到目前为止,我尝试过的所有工作都以无法工作或覆盖父方法而告终。 我正在使用以下代码在javascript中设置OOP: // SET UP OOP // surrogate constructor (empty function) function surrogateCtor() {} function extend(base, sub) { // copy the prototype from the base to setup inheritance surrogateCtor.prototype = base.prototype; sub.prototype = new surrogateCtor(); sub.prototype.constructor = sub; } // parent class function ParentObject(name) { this.name = name; } …

10
为什么专用字段专用于类型而不是实例专用?
在C#(和许多其他语言)中,访问相同类型其他实例的私有字段是完全合法的。例如: public class Foo { private bool aBool; public void DoBar(Foo anotherFoo) { if (anotherFoo.aBool) ... } } 正如C#规范(第3.5.1节,第3.5.2节)所述,对私有字段的访问是基于类型而不是实例。我一直在与一位同事讨论这个问题,我们正试图提出一个使其如此工作的原因(而不是限制对同一实例的访问)。 我们能想到的最好的参数是进行相等性检查,其中类可能要访问私有字段以确定与另一个实例的相等性。还有其他原因吗?还是某些绝对地意味着它必须像这样工作的黄金原因,否则将完全不可能?


13
什么是代表?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 6年前关闭。 改善这个问题 我很困惑代表的实际角色是什么? 我在面试中多次被问到这个问题,但我认为面试官对我的回答不满意。 有人可以用一个实例告诉我最好的定义吗?
152 oop  delegates 

18
方法链接-为什么这是一个好习惯?
方法链接是对象方法返回对象本身以使结果被另一个方法调用的实践。像这样: participant.addSchedule(events[1]).addSchedule(events[2]).setStatus('attending').save() 这似乎被认为是一种好习惯,因为它会产生可读的代码或“流畅的界面”。但是,对我而言,它似乎打破了面向对象本身所隐含的对象调用表示法-生成的代码不代表对先前方法的结果执行的动作,通常这是面向对象的代码的工作方式: participant.getSchedule('monday').saveTo('monnday.file') 这种差异设法为“调用结果对象”的点标记创建了两种不同的含义:在链接的上下文中,以上示例将被视为保存参与者对象,即使该示例实际上旨在保存计划表也是如此。 getSchedule接收的对象。 我知道这里的区别在于是否应期望被调用方法返回某些内容(在这种情况下,它将返回被调用对象本身进行链接)。但是,这两种情况与符号本身并没有区别,仅与被调用方法的语义相区别。当不使用方法链接时,我总能知道方法调用是在与上一个调用的结果相关的操作上进行的-通过链接,这种假设会中断,并且我必须在语义上处理整个链,以了解实际对象是什么叫真的是。例如: participant.attend(event).setNotifications('silent').getSocialStream('twitter').postStatus('Joining '+event.name).follow(event.getSocialId('twitter')) 那里的最后两个方法调用引用了getSocialStream的结果,而之前的方法引用了参与者。实际在上下文发生变化的地方写链可能不是一个好习惯(是吗?),但是即使如此,您也必须不断检查看起来相似的点链实际上是否在同一个上下文中,或者仅在结果上起作用。 在我看来,虽然表面上的方法链接确实会产生可读的代码,但点符号含义的重载只会导致更多的混乱。由于我不认为自己是编程专家,所以我认为这是我的错。所以:我想念什么?我是否理解方法链接有些错误?在某些情况下方法链接特别好还是在某些情况下特别糟糕? 旁注:我理解这个问题可以理解为掩盖为问题的意见陈述。但是,它不是-我真正地想了解为什么链被认为是一种好习惯,而在认为链打破了固有的面向对象表示法的地方,我犯了错。

12
继承与聚合
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意测验或进一步的讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 8年前关闭。 关于如何在面向对象的系统中最好地扩展,增强和重用代码,有两种思路: 继承:通过创建子类来扩展类的功能。覆盖子类中的超类成员以提供新功能。使方法抽象/虚拟化,以在超类需要特定接口但对其实现不可知时,强制子类“填入空白”。 聚合:通过采用其他类并将它们组合为新类来创建新功能。将公共接口附加到此新类,以与其他代码互操作。 两者的收益,成本和后果是什么?还有其他选择吗? 我看到这个辩论是定期进行的,但是我认为还没有在Stack Overflow上被要求(尽管有一些相关的讨论)。令人惊讶的是,谷歌也缺乏良好的搜索结果。

14
“低耦合和高凝聚力”是什么意思
我在理解该声明时遇到困难low in coupling and high in cohesion。我已经在Google上搜索并阅读了很多相关内容,但仍然很难理解。 据我了解High cohesion,这意味着我们应该具有专门用于执行特定功能的类。希望这是正确的?类似于信用卡验证类,该类专门用于仅验证信用卡。 仍然不了解低耦合是什么意思?
151 oop  ooad 

4
覆盖ActiveRecord属性方法
我在说的一个例子: class Person < ActiveRecord::Base def name=(name) super(name.capitalize) end def name super().downcase # not sure why you'd do this; this is just an example end end 这似乎可行,但是我刚刚阅读了ActiveRecord :: Base docs中有关覆盖属性方法的部分,并建议使用read_attributeand write_attribute方法。我认为以上示例中的操作一定存在问题;否则,为什么他们会认为这些方法是覆盖属性方法的“正确方法”?他们也强迫使用更丑陋的习惯用法,因此一定有充分的理由... 我真正的问题:这个例子有什么问题吗?

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.