About Methods(中文)

方法是一种特殊类型的属性,它只是指向一个函数。通常,该函数设计为对对象中包含的数据进行操作。

例如,假设你想修改 Customer 对象,使其包含一个函数,该函数返回应按邮寄标签上打印方式显示的客户邮寄地址。Customer 对象已包含构成此地址的字段,但形式不正确。

你可以构建一个单独的函数来按如下方式构造地址:

Customer_mailingaddress(obj):=
    obj.name+"\n"+
    obj.address+"\n"+
    obj.city+" "+obj.state+"  "+obj.zipcode

此函数接受一个 Customer 对象作为输入参数,然后通过按正确顺序连接正确的字段来构造地址。你可以按如下方式调用此函数:

Customer_mailingaddress(customer)

更好的方法是将 mailingaddress 函数作为对象本身的一部分。为此,你必须修改 Customer 对象构造函数,以按如下方式定义一个附加属性:

Customer(name):={
    .name=name;
    .address="";
    .city="";
    .state="";
    .zipcode=0;
    .phonenumber="";
    .mailingaddress=Customer_mailingaddress;
}

接下来,修改函数 Customer_mailingaddress,将所有出现的参数 obj 替换为对 this 的引用,并移除输入参数。

Customer_mailingaddress(none):=
    this.name+"\n"+
    this.address+"\n"+
    this.city+" "+this.state+"  "+this.zipcode

参见此项。

请记住,在 DScript 中,为此使用关键字是可选的,因此你可以按如下方式简化定义:

Customer_mailingaddress(none):=
    .name+"\n"+
    .address+"\n"+
    .city+" "+.state+"  "+.zipcode

现在,你可以通过调用对象的 mailingaddress 方法来获取任何 Customer 对象的邮寄地址:

customer.mailingaddress()

当你执行对象的方法时,关键字 this 指向的是对象本身。这使你无需将对象作为参数传递。

请注意,即使函数 Customer_mailingaddress 不接受任何参数,该函数也定义了一个名为 none 的哑参数。这样做是为了确保 Customer_mailingaddress 被定义为函数而不是常量。如果 Customer_mailingaddress 被定义为

Customer_mailingaddress:=...

Customer_mailingaddress():=...

则对象构造函数中的最后一行

.mailingaddress=Customer_mailingaddress;

会将属性 mailingaddress 设置为等于 Customer_mailingaddress 的值,而不是将其设置为指向该函数的指针。