JS++ final修饰符
在上一节讨论的虚拟方法的背景下,’final’修饰符允许我们形成一个更加正确的规范。
当应用于被覆盖的方法时,’final’修饰符允许我们指定该方法的覆盖是最后一次,不能再被覆盖。这可以防止子类进一步重写该方法。事实上,使用’final’修饰符而不是’override’修饰符可以是很好的防御性编程。只有当我们需要进行子类化时,编译器才会给出一个错误,告诉我们不能进一步覆盖先前指定为 “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();
}
}
}
如果你编译代码并观察结果,你应该看到它的行为与我们使用’override’修饰符的情况完全一样。
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’类。这只是一个示范。在进入下一节之前,请确保你的项目可以编译。