Tag: oop

OOPinheritance和默认构造函数

假设有一个基类A和一个从B派生的类B 然后,我们知道类A的构造函数永远不会被类Binheritance。 但是,当创buildB的新对象时,则在调用B类的默认/自定义构造函数之前调用类A的默认构造函数。 也许这样做的目的是类A的字段需要被初始化为默认值。 现在,假设类A定义了一个自定义的构造函数。 这意味着类A的默认构造函数被编译器自动删除。 现在,创build一个B类的新实例,在调用类B的构造函数之前,会自动调用A类的构造函数? (在这种情况下, A类字段是如何初始化的?)

在类的构造函数中返回一个值

到目前为止,我有一个PHP类的构造函数 public function __construct ($identifier = NULL) { // Return me. if ( $identifier != NULL ) { $this->emailAddress = $identifier; if ($this->loadUser() ) return $this; else { // registered user requested , but not found ! return false; } } loadUser的function是查找特定电子邮件地址的数据库。 当我设置标识符到一些电子邮件,我敢肯定它不在数据库中; 第一个IF被通过,并且进入第一个ELSE。 这里的构造函数应该返回FALSE; 但相反,它将返回具有所有NULL值的类的对象! 我如何防止这个? 谢谢 编辑: 谢谢大家的答案。 这相当快! 我看到OOP的方式是抛出一个exception。 所以抛出一个,我的问题改变,我应该怎么做的exception? php.net的手册很混乱! // […]

面向对象的最佳实践 – inheritancev合成v接口

我想问一个关于如何处理简单的面向对象devise问题的问题。 我有一些关于解决这个问题的最佳方法,但我希望听到Stack Overflow社区的一些意见。 有关网上文章的链接也赞赏。 我正在使用C#,但问题不是语言特定的。 假设我正在写一个video存储应用程序,其数据库有一个Person表, PersonId , Name , DateOfBirth和Address字段。 它还有一个Staff表,它有一个PersonId链接,还有一个Customer表也​​链接到PersonId 。 一个简单的面向对象的方法就是说,一个Customer “是”一个Person ,因此创build类有点像这样: class Person { public int PersonId { get; set; } public string Name { get; set; } public DateTime DateOfBirth { get; set; } public string Address { get; set; } } class Customer : Person { public int […]

什么是“针对接口,而不是对象的代码”的Python版本?

受到一个很好的问题(以及一堆很好的答案)的启发。 “对一个接口,而不是一个对象的代码”语句在Python中有什么意义吗? 我正在寻找像原始问题的答案,但与Python的片段和想法。

协会vs组合vs协会vs直接协会

我正在审查我在面向对象编程方面的知识。 在类课题的关系下,我遇到了一些对我有点模糊的关系。 我知道依赖“使用一个”和inheritance“是一个”,但我有点不熟悉聚合,组成,协会和直接关联; 而且,他们中哪一个是“有一个”的关系。 有些使用聚合与公会交替。 什么是直接关联? 另外,什么是组成? 在UML图中,表示它们的箭头是不同的。 如果你能为我清除这些东西,我会非常感激。

CoffeeScript:对象初始化器中的Getter / Setter

ECMAScript允许我们定义getter或setter如下: [文本/ JavaScript的] var object = { property: 7, get getable() { return this.property + 1; }, set setable(x) { this.property = x / 2; } }; 如果我正在使用一个类,我可以解决这个问题: [文本/ CoffeeScript的] "use strict" Function::trigger = (prop, getter, setter) -> Object.defineProperty @::, get: getter set: setter class Class property: '' @trigger 'getable', -> 'x' member: 0 但是,如果我想直接在对象上定义触发器, […]

为什么公共领域比属性更快?

我在XNA中玩弄,看到Vector3类使用公共字段而不是属性。 我尝试了一个快速的基准,发现对于一个struct的差异是相当戏剧性的(将两个向量加在一起,一亿次带有属性的2.0s和带有字段的1.4s)。 对于一个参考types,差异似乎并不大,但它在那里。 那么为什么呢? 我知道一个属性被编译成get_X和set_X方法,这会招致方法调用的开销。 但是,这些简单的getter / setter是不是总是被JIT内联? 我知道你不能保证JIT决定做什么,但是肯定这个概率是相当高的? 还有什么是在机器层面上将公共领域与财产分开的? 还有一件事我一直在想:一个自动实现的属性( public int Foo { get; set; } )如何比公共领域更好的OOdevise? 或者更好地说:这两个不同呢? 我知道,使它成为一个财产更容易与反思,但别的? 我敢打赌,这两个问题的答案是一样的。 顺便说一句:我正在使用的.NET 3.5 SP1,我相信固定的问题结构的方法(或结构的方法,我不知道)没有内衬,所以不是这样。 我想我至less使用它,这是肯定安装,但是,然后再次,我使用Vista的64位与SP1应该有DX10.1,除了我没有DX10.1 .. 另外:是的,我一直在运行发布版本:) 编辑 :我很欣赏快速答案的家伙,但我表示,我知道一个属性访问是一个方法调用,但我不知道为什么,可能是内联方法比直接字段访问速度慢。 编辑2 :所以我创build了另一个使用显式GetX()方法的结构(o我怎么不会错过我的Java日子),并执行相同的是否我禁用内联(通过[MethodImplAttribute(MethodImplOptions.NoInlining)] )或不,所以结论:非静态方法显然不是内联的,甚至不在结构上。 我认为有些例外,JIT可以优化虚拟方法。 为什么不能在不知道inheritance的结构上发生,因此方法调用只能指向一种可能的方法,对吗? 或者是因为你可以实现一个接口吗? 这真是一种耻辱,因为它真的会让我思考如何在性能关键的东西上使用属性,但是使用字段会让我感到肮脏,所以我不妨写下我在C中所做的事情。 编辑3 :我发现这个post关于完全相同的主题。 他的最终结论是,财产呼叫确实得到了优化。 我也可以发誓,我已经读了很多次,尽pipe是在IL中的callvirt ,简单的getter / setter属性将被内callvirt 。 那么我疯了吗? 编辑4 :里德·科普塞在下面的评论中发布了答案: 回复:编辑3 – 看到我更新的评论:我相信这是x86 JIT与x64 JIT问题。 在64位的JIT是不成熟的。 我希望随着更多的64位系统每天上网,MS会迅速改进。 […]

在函数式编程中实现多态

目前我正在享受从面向对象语言到function语言的转变。 这是一股清新的空气,我发现自己比以前更富有成效。 然而 – OOP的一个方面,我还没有看到FP方面令人满意的答案,那就是多态 。 即我有大量的数据项,当它们被传递到某些函数时需要以不同的方式处理。 为了论证,假设有多种因素推动多态行为,所以潜在地呈指数forms的许多不同的行为组合。 在OOP中,可以使用多态性相对较好地处理:通过组合+inheritance或基于原型的方法。 在FP我有点卡住之间: 编写或编写纯粹的函数,通过分支每个数据项的值有效地实现多态行为 – 感觉就像组装一个巨大的条件表,甚至模拟一个虚拟方法表! 把函数放在纯数据结构中,就像原型一样 – 这看起来像是起作用,但是这不违背定义与数据分开的纯函数的思想吗? 什么是这种情况推荐的function方法? 还有其他好的select吗?

我可以在另一个类中实例化一个PHP类吗?

我想知道是否允许在另一个类中创build一个类的实例。 或者,我必须在外部创build它,然后通过构造函数传入它? 但是,我会创造它,而不知道我是否需要它。 示例(一个数据库类): class some{ if(…..){ include SITE_ROOT . 'applicatie/' . 'db.class.php'; $db=new db

如何正确使用状态模式?

我在编程经验中遇到了一些状态模式的实现,并做了一些。 我已经看到他们在各种情况下使用(主要是用户界面和parsing)。 麻烦的是,它们都在快速发展的压力下变成了几乎不可维护和可以理解的代码块。 我正在考虑重构其中的一个,但我很难find这个在线的好资源。 在线状态模式有很多简单的例子,但是我需要更深入的资源。 所以我在找: 当执行状态模式和如何避免它们时常见的陷阱的例子, 现实世界中的状态模式正确完成的例子(如在一些开源项目/框架中) 个人经验与国家格局也受到欢迎 感谢您的时间