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

2024-02-03

我的姐夫是一名大学工程专业的新生。他之前没有编程经验。他正在课堂上学习编程,但他似乎在基本概念上遇到了困难。更糟糕的是,他似乎是所有班级中唯一没有编程背景的人。

他在 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;
    }

}

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

然后我又做了第二辆车:var myMiniVan = new Car(21.5, 14)并展示了一辆汽车的运行方法如何不会影响另一辆汽车。

但他没有明白。所有这一切都超出了他的理解范围。我可以使用更好或更简单的视觉类比吗?我解释错了吗?


我们老师用的是:

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

另外,据我记得,有一些很好的例子.

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

UPDATE

我刚刚想起了基本 OOP 概念的另一个很好的描述性示例:GUI 组件(按钮、文本框、标题、对话框)。这些例子并不像动物和汽车那样“抽象”,而且相当具有描述性——结果可以立即看到。 GUI 框架有很多,你可以建议你的兄弟使用其中之一。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 如何知道一个变量是否只是另一个对象的“指针”或者是否可以独立存在

    App New Object TypeName Microsoft SqlServer Dts Runtime Application PackageFullPath C SSISPackage dtsx Package App LoadP
  • Matlab:不正确的索引矩阵参考(或智胜matlab)

    我希望能够写jasmine http pivotal github io jasmine 类似于 Matlab 中的测试 所以像 expect myfibonacci 0 toBe 0 expect myfibonacci 5 toBe 1
  • John Resig 的 Javascript 继承片段是否已弃用?

    我正在寻找一种简单的方法来创建两个类 一个类继承另一个类 子类重新定义父类的方法之一 并在新方法中调用父类的方法 例如 有一个班级Animal and Dog 其中 Animal 类定义了一个方法makeSound 它建立了如何输出声音 然
  • 获取具有最高属性值的对象的最佳方式

    我有以下学生对象的多维数组 var students name Jack age NYN attempts 3 wrong 2 name Phil age NNNY attempts 4 wrong 3 name Tom age attem
  • Delphi 有通用的“对象池”实现吗?

    我在寻找 Delphi 的数据库连接池实现时遇到了这个问题 对象池需要两个方法 get 从池中获取一个对象 如果池为空或者其大小尚未达到最大大小 这将创建一个新实例 此方法必须是线程安全的 以便两个线程不能同时获取一个对象同一时间 如果所有
  • 接口实现中的非接口方法

    我有一个定义方法的接口 我有一个结构实施这个界面 在其中 我实现了该接口中的方法 并且还定义了其他方法 例如 package main import fmt type Animal interface MakeNoise type Dog
  • 在 Actionscript 3 中实现单例模式类的最佳方法是什么?

    由于 AS3 不允许私有构造函数 因此构造单例并保证构造函数不是通过 new 显式创建的唯一方法是传递单个参数并检查它 我听说过两个建议 一个是检查调用者并确保它是静态 getInstance 另一个是在同一包命名空间中拥有一个私有 内部类
  • 如何在基类中声明类似工厂的方法?

    我正在寻找 C 类设计问题的解决方案 我想要实现的是在基类中拥有静态方法方法 它将返回后代类型对象的实例 关键是 其中一些应该是单身人士 我正在用VCL编写它 所以有可能使用 properties 但我更喜欢纯 C 解决方案 class B
  • 如何区分类实现中两个协议的相同方法名称?

    我有两个协议 protocol P1 void printP1 void printCommon end protocol P2 void printP2 void printCommon end 现在 我在一个类中实现这两个协议 inte
  • 名称中带有点的 php 对象属性

    我有 mysql 表 其中包含 操作 日期 操作 名称 等列 将该表数据作为对象获取后 mysqli gt fetch object 我得到这个 行的 print r stdClass Object id gt 2 operation da
  • 适当使用静态方法

    从概念上讲 当方法仅接受输入并将输入重新格式化为输出时 使用静态方法 C 是否合适 例如 public static string FormatString string inputString return some formatting
  • 在java中将对象声明为final

    有人可以澄清以下代码的意义吗 class A int i 10 public void setI int b i b public int getI return i class Test public static void main S
  • 注册模式和注册对象的延迟实例化

    让我们想象一下我们有注册表模式
  • 当代码依赖于两个对象的子类型时,是否有设计模式可以处理

    我会尽力尽可能明确 以防有比回答我的问题更好的解决方案 我正在使用 C 工作 我有一个报告模板 可以包含任意数量的打开的 功能 功能可能是信息表 饼图 条形图 列表等 我将报告生成为文本文件或 PDF 将来可能有其他选项 到目前为止我有一个
  • php oop 如何使用属性和方法形成类

    我是 php oop 的新手 我对类有一些想法 但我仍然不知道如何在创建的对象中使用它的属性和方法 我需要了解下面报告的代码是否正确 如果不正确我做错了什么 我假设我有一个可以为我做任何事情的课程 我们称之为 Class myClass 现
  • Python Tkinter OOP 布局配置

    我正在尝试使用 tkinter 构建一个应用程序 该布局在没有 OO 原则的情况下工作 但我很难理解应该如何将其转移到 OO The layout is as shown in the pic below 1280x720px 我有以下内容
  • 为什么c++中的构造函数不能声明为静态?

    我最近读完了第一卷 Bruce Eckel 的 Thinking in C 现在转向将这些知识应用到一些实际用途中 我最近正在使用静态成员函数 并尝试将构造函数设为静态 但编译器对此不满意 我查了书上的原因 但没有找到 谁能解释为什么 P
  • 在 init 之外在 java 中创建对象

    因此 对于我正在创建的游戏 我有一些扩展 GameDriver 的类 到目前为止 在所有其他类上我都能够扩展 GameDriver 然后在 GameDriver 中我可以执行以下操作 ArrayList
  • 如何获取MATLAB句柄对象的ID?

    当我尝试使用时出现问题MATLAB 句柄对象 http www mathworks com help techdoc ref handle html作为关键值MATLAB 容器 Map http www mathworks com help
  • 为什么我们不能在函数式接口中重载抽象方法? (爪哇)

    所以我熟悉java中的函数式接口 以及它们与lambda表达式的使用 一个函数式接口只能包含一个抽象方法 当从 lambda 表达式使用这一孤独方法时 您不需要指定其名称 因为接口中只有一个抽象方法 编译器知道这就是您正在引用的方法 Exa

随机推荐