如何向初学者描述面向对象的编程?有一个很好的现实世界类比吗?

时间:2011-01-26 13:09:49

标签: oop

我的姐夫是大学新生工程专业。他没有先前的编程经验。他正在课堂上学习编程,但他似乎在努力学习基本概念。如果没有一些编程背景,他似乎是所有班级中唯一的人。

他在Matlab中做得很好(我不知道),然后在他学习Python的基础知识时帮助了他。很快,他的课程将从C和C ++开始。当面向对象编程出现时,我担心他会落后。

我尝试用汽车的比喻向他解释。

伪代码:

Class Car 
{
    public string make;
    public string model;
    private string milesPerGallon;
    private float gasolineGallonsInTank = 0;
    private float tankCapacity;
    private float odometer = 0;

    public Car(maxGas, mpg) 
    {
        tankCapacity = maxGas;
        milesPerGallon = mpg;
    }

    public void fillTank() 
    {
        gasolineGallonsInTank = tankCapacity;
    }

    public void drive(float miles) 
    {
        if (miles == 0) 
        {
            print("You don't want to drive?");
            return;
        }

        if(miles < 0)
        {
            print("Ok, we're driving in reverse!");
            miles = Math.AbsoluteValue(miles);
        }

        float maxDistance = gasolineGallonsInTank / milesPerGallon;
        if (maxDistance >= miles)
        {
            odometer += maxDistance;
            gasolineGallonsInTank = 0;
            print("You've run out of gas!");
            return;
        }

        odometer += miles;
        gasolineGallonsInTank -= miles / milesPerGallon;

    }

    public float readOdometer()
    {
        return odometer;
    }

}

我说汽车类就像一个汽车工厂,var mySedan = new Car(12, 20)就像生产一辆装有12加仑汽油箱和20英里/加仑汽车的新车。然后我向他展示了如何运行这些方法,就像发生在汽车上的事情一样。

然后我开了第二辆车:var myMiniVan = new Car(21.5, 14)并展示了一辆车的跑步方式对另一辆车的影响。

但他没有得到它。所有这一切都超越了他的头脑。我可以使用更好或更简单的视觉类比吗?我解释错了吗?

5 个答案:

答案 0 :(得分:1)

答案 1 :(得分:1)

我们的老师用过:

  • 汽车及其组件 - 用于解释类,字段,方法以及显示什么是聚合和组合
  • 动物(男人,老虎和猫,正是:)) - 解释继承
  • 形状 - 解释更多继承和多态

另外,据我记得,OOA&D book by Grady Booch中有一些很好的例子。

在第一次OOP研讨会上,我们做了一个非常不寻常的有趣练习:我们在C(而不是C ++)中实现了“类”。我们必须使用结构和函数指针 - 这使我们感觉到,什么是状态,什么是行为,什么是类和对象。然后我们继续学习C ++。

<强>更新

我只记得一个基本OOP概念的更好的描述性示例:GUI组件(按钮,文本框,标题,对话框)。这些例子并不像动物和汽车那样“抽象”,而且它们具有相当的描述性 - 结果可以立即看到。 有许多GUI框架, - 你可以建议你的兄弟玩其中一个。

答案 2 :(得分:1)

也许你应该选择他理解的程序(例如在python中)。并向他展示遵循oo方法的好处。这是我在获得一些基本的C知识后学习C ++的方法。 但我认为你的解释已经很清楚了。

答案 3 :(得分:0)

另一个很好的类比(特别是对于工科学生来说)可能是机器零件。

取一个化油器。 Carburrettor A设计用于满足特定电机的某些特性,包括歧管和碳水化合物之间的INTERFACE(通常用垫圈密封,也符合界面)。

在任一表面上都有一些必须排列的孔,并且燃料预计会以特定的压力和体积速率从气体管线输送到化油器。预计Carb会向歧管输送一定的燃料 - 空气混合物,以达到一定的真空压力等。

这是公共界面的良好起点。 Carb制造商不需要了解除了碳水化合物和歧管之间界面模板以外的电机,以及燃料 - 空气混合物和歧管预期体积的某些规格。同样,电机并不关心碳水化合物如何做它所做的事情,它只需要在适当的压力下将燃料输送到歧管中的适当孔,这样碳水化合物就可以发挥一些神奇的功能,并提供适当的功能。按需燃料空气混合物。不同的制造商可能以不同的方式实现这一点,但只要输入和输出相同,一切都可以正常工作。

在碳水化合物中,有各种各样的事情发生,以更好地控制燃料流量,并用皮托管测量真空压力等。这些类似于PRIVATE函数和方法。化油器打结的方法,给定X的真空压力,我需要向歧管提供数量的燃料Y和空气量Z.

虽然这不一定能很好地描述私有成员变量,getters vs setter等,但它可以帮助理解接口,excapsulation和Private vs Public方法。对我来说,这最初比私人成员变量更难掌握(尤其是“接口”部分......)。

答案 4 :(得分:0)

编程最好通过实践来学习。

与他一起编写一个简单的地址簿应用程序。 (无需保存任何内容,因为这是一次OOP学习体验。)创建一个代表地址簿中每条记录的类CEntry。它将包含诸如人名,街道地址,城市,州,邮政编码和电话号码之类的内容。创建另一个类CName,其中包含firstmiddle,last成员。最后,制作第三个班级CPhone,其中包含countryarea_codeprefixnumber的成员。在他编写时,您可以解释为什么类的使用对此应用程序有意义,以及使CEntry继承CNameCPhone或包含新实例的优点和缺点这些课程。