Questions tagged «oop»

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

6
为什么使用未命名的命名空间,它们有什么好处?
我刚刚加入了一个新的C ++软件项目,并且试图了解其设计。该项目频繁使用未命名的名称空间。例如,在类定义文件中可能会出现这样的情况: // newusertype.cc namespace { const int SIZE_OF_ARRAY_X; const int SIZE_OF_ARRAY_Y; bool getState(userType*,otherUserType*); } newusertype::newusertype(...) {... 有哪些设计考虑因素可能会导致使用未命名的命名空间?优点和缺点是什么?
242 c++  oop  namespaces 

22
如何按多个字段比较对象
假设您有一些对象,这些对象具有可以通过以下方式比较的多个字段: public class Person { private String firstName; private String lastName; private String age; /* Constructors */ /* Methods */ } 因此,在此示例中,当您询问是否: a.compareTo(b) > 0 您可能会问a的姓氏是否早于b的姓氏,或者a是否早于b,等等。 在这些对象之间进行多重比较而不增加不必要的混乱或开销的最干净的方法是什么? java.lang.Comparable 界面仅允许一个字段进行比较 在我看来compareByFirstName(),添加许多比较方法(即,compareByAge()等)比较混乱。 那么最好的方法是什么呢?
237 java  oop 

23
您如何设计面向对象的项目?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引文回答。 3年前关闭。 改善这个问题 我正在为一个大型项目工作(对我来说),该项目将有许多类并且需要可扩展,但是我不确定如何计划程序以及类之间如何交互。 几个学期后,我参加了OOD课程,并从中学到了很多东西。例如编写UML,以及将需求文档转换为对象和类。我们也学习了顺序图,但是以某种方式我错过了讲座或其他内容,但它们并没有真正与我保持联系。 在以前的项目中,我尝试使用从本课程中学到的方法,但是通常最终得到的代码是,只要我能说“是的,看起来像我的想法”,我就不希望深入研究添加新功能。 我得到了史蒂夫·麦康奈尔(Steve McConnell)的《代码完成》的副本,在这里和其他地方,我一直听到我很惊讶。我阅读了有关设计的章节,但似乎没有得到我所寻找的信息。我知道他说这不是一成不变的过程,它主要是基于启发法,但是我似乎无法吸收他的所有信息并将其应用于我的项目。 那么,在高级设计阶段(开始编程之前)要做什么,以确定需要哪些类(尤其是那些不基于任何“现实世界对象”的类),以及它们将如何相互影响? 我特别对您使用的方法感兴趣?您遵循的过程通常会形成一个良好,干净的设计来紧密代表最终产品的流程是什么?


15
PHP接口的意义是什么?
接口允许您创建定义实现它的类的方法的代码。但是,您不能向这些方法添加任何代码。 抽象类使您可以做同样的事情,并向方法中添加代码。 现在,如果您可以使用抽象类实现相同的目标,那么为什么我们甚至需要接口的概念? 有人告诉我,它与从C ++到Java的OO理论有关,这是PHP的OO东西所基于的。这个概念在Java中有用但在PHP中没有用吗?这只是一种避免在抽象类中乱扔占位符的方法吗?我想念什么吗?
224 php  oop  interface  theory 

12
合并两个PHP对象的最佳方法是什么?
我们有两个PHP5对象,并希望将其中一个的内容合并到第二个中。它们之间没有子类的概念,因此以下主题中描述的解决方案不适用。 如何将PHP对象复制到其他对象类型 //We have this: $objectA->a; $objectA->b; $objectB->c; $objectB->d; //We want the easiest way to get: $objectC->a; $objectC->b; $objectC->c; $objectC->d; 备注: 这些是对象,而不是类。 对象包含很多字段,所以foreach会很慢。 到目前为止,我们考虑将对象A和B转换为数组,然后在重新转换为对象之前使用array_merge()合并它们,但是我们不能为此感到骄傲。
222 php  oop  object 


15
Python函数重载
我知道Python不支持方法重载,但是我遇到了一个似乎无法用一种很好的Pythonic方法解决的问题。 我正在制作一个角色需要射击各种子弹的游戏,但是如何编写用于创建这些子弹的不同功能?例如,假设我有一个函数,该函数创建一个以给定速度从A点移动到B点的子弹。我会写一个像这样的函数: def add_bullet(sprite, start, headto, speed): ... Code ... 但是我想编写其他创建项目符号的功能,例如: def add_bullet(sprite, start, direction, speed): def add_bullet(sprite, start, headto, spead, acceleration): def add_bullet(sprite, script): # For bullets that are controlled by a script def add_bullet(sprite, curve, speed): # for bullets with curved paths ... And so on ... 以此类推。有没有一种更好的方法可以在不使用太多关键字参数的情况下实现快速更新呢?重命名各功能是非常糟糕的一点,因为你要么add_bullet1,add_bullet2或add_bullet_with_really_long_name。 …

13
为什么C ++ STL如此大量地基于模板?(而不是在* interfaces *上)
我的意思是,除了它的专有名称(标准模板库)之外... C ++最初打算将OOP概念呈现到C中。也就是说,您可以根据其类和类层次结构来判断特定实体可以做什么和不可以做什么(无论它如何执行)。由于多重继承的问题,某些能力组合很难用这种方式描述,而且C ++以某种笨拙的方式(与Java等相比)支持接口的概念,但是它确实存在(并且可能是改进)。 然后,模板与STL一起发挥作用。STL似乎采用了经典的OOP概念,并使用模板来冲洗它们。 在使用模板来泛化类型的情况之间应该有所区别,其中类型主题与模板的操作无关(例如,容器)。有一个vector<int>完美的意义。 但是,在许多其他情况下(迭代器和算法),模板化类型应遵循“概念”(输入迭代器,正向迭代器等),其中概念的实际细节完全由模板的实现定义函数/类,而不是模板使用的类型的类,这在某种程度上是对OOP的反使用。 例如,您可以告诉函数: void MyFunc(ForwardIterator<...> *I); 更新:由于原始问题尚不清楚,因此可以将ForwardIterator本身进行模板化以允许任何ForwardIterator类型。相反,将ForwardIterator作为概念。 仅通过查看其定义就可以期待一个正向迭代器,您需要在其中查看实现或以下文档: template <typename Type> void MyFunc(Type *I); 我可以支持使用模板的两个主张:通过为每种使用的类型量身定制模板,而不是使用vtable,可以使编译后的代码更高效。模板可以与本机类型一起使用的事实。 但是,我正在寻找一个更深层的原因,为什么放弃传统的OOP来支持使用STL?(假设您读到了这么远:P)
211 c++  oop  templates  stl 


3
基于原型与基于类的继承
在JavaScript中,每个对象同时是一个实例和一个类。要进行继承,可以将任何对象实例用作原型。 在Python,C ++等中。有类和实例作为单独的概念。为了进行继承,您必须使用基类创建一个新类,然后该新类可用于生成派生实例。 为什么JavaScript朝这个方向发展(基于原型的面向对象)?与传统的基于类的OO相比,基于原型的OO有哪些优点和缺点?

22
为什么C#不提供C ++样式的“ friend”关键字?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引文回答。 3年前关闭。 改善这个问题 在C ++朋友关键字允许class A指定class B作为其朋友。这允许Class B访问的private/ protected成员class A。 我从来没有读过任何关于为什么C#(和VB.NET)不包含此内容的信息。对于这个较早的StackOverflow问题的大多数答案似乎都是在说它是C ++的有用组成部分,并且有充分的理由使用它。以我的经验,我必须同意。 在我看来,另一个问题确实是在问如何friend在C#应用程序中执行类似的操作。尽管答案通常围绕嵌套类,但似乎并不像使用friend关键字那样优雅。 原始的《设计模式》一书在整个示例中都定期使用它。 因此,总而言之,为什么friendC#缺少它?在C#中模拟它的“最佳实践”方法是什么? (顺便说一句,internal关键字不是同一回事,它允许整个程序集中的所有类访问internal成员,而friend允许您为某个类提供对另一个类的完全访问权限)
208 c#  c++  design-patterns  oop  friend 

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



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.