📜  JS++ |遗产

📅  最后修改于: 2022-05-13 01:55:37.249000             🧑  作者: Mango

JS++ |遗产

到目前为止,我们定义的唯一动物类型是猫(通过 'Cat' 类)。我们的“猫”类还要求我们为猫命名。最后,我们的“Cat”类对网页进行渲染。但是,如果我们想引入其他动物怎么办?我们应该如何实现狗、熊猫和犀牛?

虽然简单的答案是我们可以将代码从 Cat.jspp 复制、粘贴和修改到 Dog.jspp、Panda.jspp 和 Rhino.jspp,但这通常不是好的编程。相反,我们可能会注意到设计中有很多重复;所有的动物都需要一个名字,所有的动物都需要渲染到我们的网页上,所有的动物都可以归类在一起。因此,我们可以为动物定义我们需要的一般行为(例如渲染到网页),并让我们所有的动物类“继承”这种常见行为。此外,有些动物可能不需要名字;例如,像猫和狗这样的家养动物可能需要名字,但我们可能不想给我们的熊猫和犀牛命名。

首先,让我们从检查 Cat.jspp 开始。 Cat.jspp 中的哪些数据或行为应该为所有动物所共有?

从我们到目前为止定义的内容来看,它应该只是 render() 方法。我们将使用它作为理解继承的基础。之前,我们创建了一个 Animal.jspp 文件。它目前是空的,所以打开它,让我们定义一个“动物”类:

external $;

module Animals
{
    class Animal
    {
        var $element = $(
            """
            
""" ); void render() { $("#content").append($element); } } }

这很适合作为基本模板。然而,敏锐的观察者会注意到我们有一个问题:$element 字段总是会呈现一个猫图标。我们稍后会回到这个问题,但首先,让我们更改 Cat.jspp 以从我们的新“Animal”类继承:

external $;

module Animals
{
    class Cat : Animal
    {
        string _name;

        Cat(string name) {
            _name = name;
        }
    }
}

我们从 Cat.jspp 中删除了 $element 字段和 render() 方法,并将其添加到类声明中:

class Cat : Animal

冒号语法指定继承关系。在这种情况下,我们的“Cat”类继承自“Animal”类。换句话说,我们的“Cat”类扩展了“Animal”类;属于“Animal”类的所有东西(字段、getter/setter、方法等)也属于“Cat”类。

在继承中,我们的“Cat”类被称为“Animal”的“子类”或“派生类”。 “动物”可以称为“超类”或“基类”。

如果您现在尝试编译您的代码,您仍然会看到与以前完全相同的猫呈现在页面上,但是,如果您将鼠标悬停在任何猫上,您将看不到其各自的名称。 'Cat' 上的 render() 方法现在派生自 'Animal' 类。由于我们的 'Animal' 类不使用名称(因为我们希望能够为熊猫和犀牛等野生动物泛化该类),它的 render() 方法同样不会渲染显示名称所需的 HTML 'title' 属性鼠标悬停。但是,我们可以使这种行为成为可能。为了做到这一点,它需要解释访问修饰符,我们现在将介绍。