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”类。这只是一个演示。在转到下一部分之前,请确保您的项目已编译。