JS++|getter和setter

在前面的示例中,我们定义了一个“setName”方法,用于设置我们声明的类“name”字段。唯一负责写入或修改类字段的方法称为“setter”或“setter方法”相反,其唯一职责是返回类字段的当前数据的方法称为“getter”或“getter方法”

null

像数组这样的容器有像“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,则可以阻止所有“写”操作。如果两者都定义,则可以同时进行读写操作。这允许您根据自己的需求进行定制。

© 版权声明
THE END
喜欢就支持一下吧
点赞15 分享