在前面的示例中,我们定义了一个“setName”方法,用于设置我们声明的类“name”字段。唯一负责写入或修改类字段的方法称为“setter”或“setter方法”相反,其唯一职责是返回类字段的当前数据的方法称为“getter”或“getter方法”
像数组这样的容器有像“length”这样的方法,它们是getter方法:
int[] arr = [ 1, 2, 3 ]; arr.length; // 3
数组的“length”方法返回数组的大小,该大小由数组元素的数量决定。然而,我们没有注意到括号的特殊性。这是因为数组的“长度”属性是以一种特殊的方式定义的。事实证明,我们可以定义自己的类来拥有这样的特殊方法。
让我们首先将“setName”方法重新定义为setter方法。打开猫。jspp,只需在“setName”前面添加“property”关键字,如下所示:
external $; module Animals { class Cat { string name; var $element = $( """ <div class="animal"> <i class="icofont icofont-animal-cat"></i> </div> """ ); property void setName(string name) { this.name = name; } void render() { $("#content").append($element); $element.attr("title", name); } } }
此时,如果您尝试编译,将得到一个错误(JSPPE0150)。我们需要编辑我们的主页。jspp文件,以反映我们对setter的更改。由于我们将“setName”定义为setter,因此不能再使用括号调用它,但必须使用赋值(=)运算符:
import Animals; Cat cat1 = new Cat(); // cat1.setName("Kitty"); cat1.setName = "Kitty"; cat1.render(); Cat cat2 = new Cat(); // cat2.setName("Kat"); cat2.setName = "Kat"; cat2.render();
现在,如果你试图编译这个项目,它应该是成功的。
那很容易!在这一点上,我们想考虑的唯一细节是这个名字是猫的属性。“setName”表示一个动作。由于我们不能让字段和方法的名称发生冲突,我们可以将我们的私有“name”字段重命名为众多命名约定中的任意一种:mName、_name等。在本教程中,为了避免名称冲突,我们更喜欢下划线,因为在某些动态语言(包括JavaScript和Python)中,下划线用于“表示”隐私(即使实际上它们不是真正的“隐私”)。通过重命名我们的私有“name”字段,我们可以将标识符“name”用作setter方法。换只猫。jspp代码如下:
external $; module Animals { class Cat { string _name; var $element = $( """ <div class="animal"> <i class="icofont icofont-animal-cat"></i> </div> """ ); property void name(string name) { _name = name; } void render() { $element.attr("title", _name); $("#content").append($element); } } }
另外,更改主菜单。反映这一变化的jspp:
import Animals; Cat cat1 = new Cat(); cat1.name = "Kitty"; cat1.render(); Cat cat2 = new Cat(); cat2.name = "Kat"; cat2.render();
Setter方法允许我们赋值(写操作)。然而,如果我们想要获取值(读取操作),除非我们定义了一个附带的getter方法,否则它是不被允许的。尝试“读取”名称字段,如下所示:
import Animals; Cat cat1 = new Cat(); cat1.name = "Kitty"; cat1.render(); Cat cat2 = new Cat(); cat2.name = "Kat"; cat2.name; cat2.render();
如果试图编译,将出现错误:
JSPPE0203: No getter defined for `Animals.Cat.name' at line 8 char 0 at main.jspp
正如您现在所推断的,setter方法的参数是分配给属性的值(右侧的值)。主要是。在上面的jspp中,值是“Kitty”和“Kat”字符串。当然,setter方法只允许接受一个参数。因为getter是一个“读取”操作,所以不需要接受任何值;因此,getter方法直观上不需要参数。利用这种直觉,我们可以定义一种附带的getter方法:
external $; module Animals { class Cat { string _name; var $element = $( """ <div class="animal"> <i class="icofont icofont-animal-cat"></i> </div> """ ); property string name() { return _name; } property void name(string name) { _name = name; } void render() { $element.attr("title", _name); $("#content").append($element); } } }
现在,如果你试图编译这个项目,你应该能够成功编译。
如您所见,如果您定义了一个没有getter的setter,那么就可以阻止所有的“读取”操作。相反,如果定义一个getter而不定义setter,则可以阻止所有“写”操作。如果两者都定义,则可以同时进行读写操作。这允许您根据自己的需求进行定制。