📜  JS++ | “最终”修饰符

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

JS++ | “最终”修饰符

在上一节讨论的虚拟方法的上下文中,“final”修饰符允许我们形成更正确的规范。

当应用于被覆盖的方法时,'final' 修饰符允许我们指定此方法覆盖是最后一个并且不能被进一步覆盖。这可以防止子类进一步覆盖该方法。事实上,使用 'final' 修饰符而不是 'override' 修饰符可能是一种很好的防御性编程。然后,我们只能在需要子类化时使用“覆盖”修饰符,并且编译器给我们一个错误,告诉我们不能进一步覆盖以前指定为“最终”的方法。这可以帮助我们防止复杂代码中出现不可预见的情况和潜在的错误。

话虽如此,让我们将 Cat.jspp 和 Dog.jspp 更改为使用“final”而不是“override”。再次,为简洁起见,我将只展示对 Cat.jspp 的更改:

external $;

module Animals
{
    class Cat : Animal
    {
        string _name;

        Cat(string name) {
            super("icofont-animal-cat");
            _name = name;
        }

        final void render() {
            $element.attr("title", _name);
            super.render();
        }
    }
}

如果您编译代码并观察结果,您应该会看到它的行为与我们使用“覆盖”修饰符完全一样。

'final' 修饰符也可以应用于一个类。当“final”修饰符应用于一个类时,这意味着该类不能再被子类化。换句话说,阻止了进一步的继承。例如,尝试将 'Cat' 声明为 'final' 并尝试从 main.jspp 子类化它:

import Animals;

class Kitten : Cat {}

Animal[] animals = [
    new Cat("Kitty"),
    new Cat("Kat"),
    new Dog("Fido"),
    new Panda(),
    new Rhino()
];

foreach(Animal animal in animals) {
    animal.render();
}

如果你尝试编译这段代码,你会得到一个错误,因为 'Cat' 是 'final' 并且不能被子类化:

JSPPE0163: Cannot inherit from final class `Animals.Cat' at ...

请从 Cat.jspp 中删除“final”修饰符,并从 main.jspp 中删除“Kitten”类。这只是一个演示。在转到下一部分之前,请确保您的项目已编译。