一个很好的面向对象的类比

时间:2010-06-29 15:01:00

标签: oop language-agnostic

我正在寻找一种向初学者描述OO的好方法,虽然是类比。

目前,我将一个班级比作购物清单,以及一个装满物品的购物车。但我觉得这有点令人困惑。

最好在代码示例(Ruby)中很好地反映这个类比,目前我有这个,并且感觉很笨拙。

# First we create a class
class Shopping

    # The items method gives us a list of items in the Shopping
    def items
    ["apple", "cereal", "flour"]
    end
end

# Create a new Shopping, called basket
basket = Shopping.new

# ask the basket what items it has
basket.items        #=> ["apple", "cereal", "flour"]

8 个答案:

答案 0 :(得分:6)

我看到它描述为Man是一个类,而Steve是一个对象(Man的实例)。史蒂夫有金发,长6英尺,重180磅等等。

然后你可以继承,所以Man继承Person,Person继承Animal,然后继续。

答案 1 :(得分:4)

我认为你不应该以类比的方式思考,而是一个澄清的例子。人们已经以面向对象的方式思考;告诉他们一个对象是一个东西而一个类是一种东西。

向他们显示2Fixnum"hello"String。然后展示一个类如何描述由什么组成的东西以及它可以做什么的例子。任何这些简单的例子,如动物或汽车,都可以正常工作。

答案 2 :(得分:2)

当我通常考虑类和对象之间的区别时,我通常倾向于将类视为蓝图。也许你可以将一个类与一个蓝图和一个对象比作一个房子?

class House
    def floor 
        @floor
    end
    def roof 
        @roof
    end
    //[etc]
end

答案 3 :(得分:1)

我不是机械师,但我经常使用汽车作为多态性和层次结构的高级示例。

我们有车辆,可以帮助我们的东西,它有方法和属性,如Move()或Park()或PassengerCount。车辆的例子可以是轿车,货车,卡车和自行车。 Sedan可能有方法和属性,如TurnOnLights(),GallonsOfGas等,但在Sedan下可能是PoliceCar。 PoliceCar可以有新的方法和参数,并重新定义一些Sedan的方法和属性,即PoliceCar的TurnOnLights()方法可以做得比轿车所能做的更多。

就实例而言,你可以向他们解释你的车是轿车的一个实例。它是蓝色的,有7加仑的气体,可以打开它的灯。走过停车场指出实例:“那是一辆面包车,有一辆轿车,这是一辆自行车。”不要把它们视为愚蠢,而是向它们展示它是如何定义的,并将它与它们已经知道的定义联系起来。在旁注中,谈谈停车场是如何作为车辆对象的数组。停车场并不关心它是什么类型的车辆。

将私人和公共方法与此相关联的方法有很多种。比如,如果你的车不知道另外一辆车有多少汽油,或类似的东西。

如果它们正在流行,你可以通过说每个Sedan(让它自动简化现在的东西)具有相同的界面来描述它们的接口。它们都提供相同的转向,加速,制动,显示燃气和里程等方法。这些功能实际如何工作可能因实例而异,但所有Sedans都提供相同的方法。由于此接口,驱动器无需知道引擎如何显式工作。

答案 4 :(得分:0)

我认为汽车类比适用于入门级车型。 Automobile可以是基本虚拟类,其成员包括make,model,一组Tire个对象,start()drive()作为方法等。派生类可以包含{ {1}},Truck

“用C ++思考”的第一章有一个很好的对象模型介绍: http://www.smart2help.com/e-books/ticpp-2nd-ed-vol-one/Frames.html

答案 5 :(得分:0)

当向初学者解释OOP时,我发现引导我们生活的世界是由对象和那些彼此相互作用的对象构成是有用的。我喜欢关注几个关键的类比,它们展示了什么是对象,它们可以组合和相关的不同方式,以及这些对象最终如何相互作用:

类比1:我会描述一个汽车引擎和构成它的不同部分,这可以解释如何使用对象来组成不同的对象。

类比2:我会描述类似于足球队的东西,并表明在这种情况下我们可能有不是由其他物体组成的物体,而是与其他物体(如其他物体,足球,场地等)相互作用。 )。我发现这有助于理解对象如何能够互动并影响另一个对象。如果你愿意,你也可以在这里引入一些继承概念(例如所有玩家如何扩展足球运动员或运动员或类似的东西)但请记住你想保持简单。

答案 6 :(得分:0)

我更喜欢使用对象作为人的类比,相互沟通以达到某个目标。

在这个类比中,一个类可能更像是角色或工作描述:Bob(对象)是一个会计(类)。

这不是典型的“以事物为中心”的设计用于初学者,但我相信它在帮助教授控制反转和正确责任分配等概念方面还有很长的路要走。

答案 7 :(得分:0)

如果你想深入思考,工业主义会说很多关于面向对象的编程。在面向对象编程中,一个类被认为是一个Employee / Person。 一种方法被视为员工/个人拥有的一个流程/技能/信息。 一个包被视为一个公司。

重要事项:始终认为这是您自己的工业公司。你是经理。执行官!你让人/员工/班级工作!那么,如果你真的很擅长这个:

  • 您可以使用其他公司/包中的其他员工/人员/班级。 (雇用他们!盗用他们!

  • 如果员工/人员/班级没有技能/流程/信息/方法,请删除它们。 (解雇他们!

  • 如果您构建的公司/包正在增长。添加员工/人员/班级。然后,您需要添加技能/流程/信息/方法来执行此操作,并按照您希望的方式对其进行编程。 (雇用他们!训练他们!

  • 如果您不喜欢与您合作的公司/套餐,请查找具有出色技能/流程/信息/方法的其他公司/套餐。 (与其他公司签订其他合同。

  • 如果您不喜欢Person / Employee / Class,请找到具有更好Skills / Process / Info / Methods的其他Person / Employee / Class。 (雇用其他人来完成这项工作。

  • 如果您的员工/员工/班级是一名优秀的推销员并且他获得晋升,他将成为人员/员工/班级销售经理,他将获得更多技能/流程/信息/方法,但仍在销售。 (给他更多任务!

不要对你的人太粗鲁,否则,他们会反叛。 (当然,这不会发生。

Read more...

相关问题