在我们的cat示例中,我们已经能够实例化我们的cat并分别提供一个名称。然而,可能需要在实例化时为猫命名,这样我们就不会意外地忘记给猫命名。构造函数允许我们控制实例化。
默认情况下,JS++为您提供了一个构造函数。这被称为“默认构造函数”如果您没有任何显式定义的构造函数,它将由JS++隐式定义。默认构造函数不接受参数,只返回类的新实例。为了理解默认构造函数,我们可以明确定义它:
external $; module Animals { class Cat { string _name; var $element = $( """ <div class="animal"> <i class="icofont icofont-animal-cat"></i> </div> """ ); Cat() { } property string name() { return _name; } property void name(string name) { _name = name; } void render() { $element.attr("title", _name); $("#content").append($element); } } }
如果你试图编译这个项目,应该没有问题。原因是,我们正在实例化“Cat”类,而主类中没有参数。jspp文件。如果您试图提供一些参数,您将得到一个错误代码的编译错误。
从显式定义的默认构造函数中可以看到,构造函数没有参数。此外,它什么也不做。(没有操作的构造函数仍将返回类的新实例。构造函数中的显式“return”语句是不必要的,也是不允许的,因为构造函数总是返回类的新实例。)
构造函数的一个特殊用途是将字段初始化为自定义值。现在,如果实例化’Cat’类,您将得到一个空字符串形式的’_name’字段。如果我们希望“Cat”的实例总是有一个名称,我们必须在实例化期间通过指定构造函数来要求它。
首先,删除getter和setter方法。第二,更改我们定义的显式构造函数,以获取一个参数:一个“string”作为cat的名称。最后,将字段初始化为提供给构造函数的参数。(你现在应该知道怎么做了。)
你的代码在Cat中。jspp现在应该是这样的:
external $; module Animals { class Cat { string _name; var $element = $( """ <div class="animal"> <i class="icofont icofont-animal-cat"></i> </div> """ ); Cat(string name) { _name = name; } void render() { $element.attr("title", _name); $("#content").append($element); } } }
下一步,我们必须改变主要的。jspp:
import Animals; Cat cat1 = new Cat("Kitty"); cat1.render(); Cat cat2 = new Cat("Kat"); cat2.render();
编译项目。开放索引。网页浏览器中的html。你应该再看看那两只猫。将鼠标悬停在他们的图像上。你应该再次看到他们的名字。
需要注意的是,隐式定义的默认构造函数(接受零参数)不再定义。一旦为类显式定义构造函数,默认构造函数将不会显式定义。因此,现在实例化“Cat”类的唯一方法是使用需要名称的构造函数。如果你试图更改main中的代码。jspp要实例化一个没有参数的类,您将得到一个编译错误。