您会如何向六年级学生解释 Scala 的抽象类功能? [复制]

2024-04-17

我试图理解 O'Reilly 的 Scala 编程中的代码示例。我是一名 JavaScript 程序员,书中的大部分解释都假设我有 Java 背景。我正在寻找对抽象类及其用途的简单、高级的解释。

package shapes {
    class Point(val x: Double, val y: Double) {
        override def toString() = "Point(" + x + "," + y + ")"
    }

    abstract class Shape() {
        def draw(): Unit
    }

    class Circle(val center: Point, val radius: Double) extends Shape {
        def draw() = println("Circle.draw: " + this)
        override def toString() = "Circle(" + center + "," + radius + ")"
    }
}

抽象的就像没有太多细节一样。这是表达“我们含糊其词”的正式方式。

说:“我有一种上班的交通工具。”比“我有一辆我开车去上班”更抽象。当然,某个地方有某个东西确切地知道你要做什么去工作。这是关于不必确切知道到处是什么。这种想法称为抽象。

使用方法:

大多数 OOP 语言中的抽象类或父类是集中可重用通用方法的地方,并为更具体的方法提供接口,这些方法的代码驻留在更具体的类或子类中。

所以如果我提供一个名为的抽象类Transportation with a takeMeToWork()你可以调用它的方法takeMeToWork()任何从运输业继承并期望最终投入工作的东西。你不会知道你是否正在服用Car or a Bicycle去工作,但你会去工作。Transportation只会承诺会有一个takeMeToWork()方法。它不会定义它是如何工作的,事实上只有在提供了一个Car or Bicycle确实如此。

如果你要求每一种形式Transportation有相同的饮料杯架,您可以放一个useCupHolder()Transport 类中的方法一次,无需再次编写。它总是在那里以完全相同的方式工作。根据语言或语言版本,该技巧可能不适用于界面或“特征”。除了提供默认实现之外,抽象类与特征没有太大区别。这个问题 https://stackoverflow.com/questions/1991042/scala-traits-vs-abstract-classes处理这些差异。


欣赏这个比喻的问题在于,除非你处于它被证明有用的情况,否则很难理解其中的要点。现在听起来可能像是很多花哨的难以理解的东西,只会让解决任何问题变得更加困难。这确实是事实。除非您发现自己正在使用足够复杂的代码来利用它并掌握抽象,否则这只会使事情变得更加困难。一旦你得到它,一切都会变得更容易。尤其是当您不单独编写代码时。下一个比喻不是经典的,但它是我最喜欢的:

为什么我们的汽车上有引擎盖?

(Or bonets http://www.english-test.net/forum/ftopic38797.html对于你们非美国人)

没有它,汽车就可以正常行驶。没有它,所有很酷的引擎东西都更容易获得。那么它是做什么用的呢?没有引擎盖,我可以坐在发动机缸体上,将一个轮子塞进齿条和销轴,抓住油门,然后驾驶汽车。现在我可以做一些很酷的事情,比如以每小时 50 英里的速度更换机油。

多年来我们发现,人们在没有量油尺在脸上的情况下驾驶确实会更舒服。因此,我们给汽车安装了引擎盖,并提供了加热座椅、方向盘和加油站。这让我们感到舒适,并防止我们的裤腿被风扇皮带卷住。

在软件中,我们提供同样的抽象事物。它有多种形式,抽象类、特征、外观模式等。即使是最简单的方法也是一种抽象形式。

您要解决的问题越复杂,使用一些明智的抽象就会越好。而且,你的车装上引擎盖看起来更酷。

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

您会如何向六年级学生解释 Scala 的抽象类功能? [复制] 的相关文章

随机推荐