我的姐夫是大学新生工程专业。他没有先前的编程经验。他正在课堂上学习编程,但他似乎在努力学习基本概念。如果没有一些编程背景,他似乎是所有班级中唯一的人。
他在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)
并展示了一辆车的跑步方式对另一辆车的影响。
但他没有得到它。所有这一切都超越了他的头脑。我可以使用更好或更简单的视觉类比吗?我解释错了吗?
答案 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
,其中包含first
,middle,
和last
成员。最后,制作第三个班级CPhone
,其中包含country
,area_code
,prefix
和number
的成员。在他编写时,您可以解释为什么类的使用对此应用程序有意义,以及使CEntry
继承CName
和CPhone
或包含新实例的优点和缺点这些课程。