代码之家  ›  专栏  ›  技术社区  ›  thomasfedb

一个好的面向对象的类比[关闭]

  •  5
  • thomasfedb  · 技术社区  · 14 年前

    我正在寻找一种很好的方法来向初学者描述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 回复  |  直到 11 年前
        1
  •  6
  •   Adam Shiemke    14 年前

    我见过它被描述为人是一个阶级,而史蒂夫是一个对象(人的例子)。史蒂夫有一头金发,身高6英尺,体重180磅,等等。

    你可以继承,所以人继承人,人继承动物,然后继续。

        2
  •  4
  •   mckeed    14 年前

    我认为你不应该用类比的方式思考,而应该用一个解释性的例子。人们已经以面向对象的方式思考了,只要告诉他们一个对象就是一件事,一个类就是一件事。

    向他们展示 2 是一个 Fixnum "hello" 是一个 String . 然后展示一个例子,说明一个类是如何描述这种东西是由什么组成的,它可以做什么。这些简单的例子中的任何一个,像动物或汽车,都可以很好地工作。

        3
  •  2
  •   KLee1    14 年前

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

    class House
        def floor 
            @floor
        end
        def roof 
            @roof
        end
        //[etc]
    end
    
        4
  •  1
  •   Corey Ogburn    14 年前

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

    我们有车辆,可以让我们四处走动的东西,还有方法和属性,比如move()或park()或passengercount。例如轿车、货车、卡车和自行车。轿车可能有turnonlights()、gallonsofgas等方法和属性,但轿车下面可能是警车。警车可以有新的方法和参数,并重新定义一些轿车的方法和属性,例如,警车的turnonlights()方法比轿车能做的要多得多。

    就实例而言,你可以向他们解释你的车是轿车的一个实例。它是蓝色的,有7加仑汽油,可以打开它的灯。只要走过一个停车场,指出例子:“那是一辆货车,那是一辆轿车,这是一辆自行车。”不要把他们当作傻子对待,而是告诉他们这是一个定义,并把它与他们已经知道的定义联系起来。在旁注中,讨论停车场是如何成为一系列车辆对象的。停车场不在乎它是什么样的车。

    有很多不同的方法可以将私有方法和公共方法联系起来。比如,如果你的车不知道另一辆车有多少汽油,或者类似的东西。

    如果他们很流行,你可以通过说每辆轿车(让我们现在自动简化事情)都有相同的界面来描述他们的界面。它们都提供了相同的转向、加速、制动、显示汽油和里程等方法。这些功能的实际工作方式各不相同,但所有轿车都采用相同的方法。由于这个接口,驱动器不需要知道引擎是如何显式工作的。

        5
  •  0
  •   Darel    14 年前

    我发现汽车类比对于入门级的模型很有效。 Automobile 可以是基本虚拟类,成员包括make、model、数组 Tire 物体, start() drive() 派生类可以包括 Truck , Compact 等。

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

        6
  •  0
  •   Ian Dallas    14 年前

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

    类比1:我将描述一个汽车引擎和组成它的不同部分,这让我了解到如何使用对象来组成不同的对象。

    类比2:我将描述一些类似于足球队的东西,并说明在这种情况下,我们可能有一些不是由其他物体组成的物体,而是与其他物体(如其他球员、足球、场地等)交互的物体。我发现这有助于理解物体是如何相互作用和影响另一物体的。如果你喜欢的话,你也可以在这里加入一些继承概念(例如,所有球员如何扩展足球运动员或运动员或类似的东西),但是记住,你希望保持简单。

        7
  •  0
  •   kyoryu    14 年前

    我更喜欢将对象比作人,通过相互交流来实现某个目标。

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

    对于初学者来说,这并不是典型的“以事物为中心”的设计,但我相信它在帮助教授控制反转和责任分配等概念方面有很大的帮助。

        8
  •  0
  •   Franz Noel    12 年前

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

    重要: 总是把它想成是你自己的工业公司。你是经理。执行官!你让人/员工/班级工作!那么,如果你真的擅长这个:

    • 您可以使用来自不同公司/套餐的其他员工/个人/班级。( 雇佣他们!海盗们! )

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

    • 如果你建立的公司/软件包正在增长。添加员工/个人/班级。然后,您需要添加技能/流程/信息/方法来完成这项工作,并按照您希望的方式对它们进行编程。( 雇佣他们!训练他们! )

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

    • 如果您不喜欢这个人/雇员/班级,请找到其他技能/流程/信息/方法更好的人/雇员/班级。( 请别人来做这项工作。 )

    • 如果你的人/雇员/班级是一个好的销售员,他得到了提升,他成为了人/雇员/班级的销售经理,他获得了更多的技能/流程/信息/方法,但仍然在销售。( 给他更多的任务! )

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

    Read more...