【问题标题】:Properties (getters and setters) in CeylonCeylon 中的属性(getter 和 setter)
【发布时间】:2018-03-31 21:15:38
【问题描述】:

如何在锡兰定义属性?我知道我可以编写 getNamesetName 函数来获取和设置支持变量:

class Circle(shared variable Float radius) {
    shared Float getArea() {
        return pi * radius ^ 2;
    }

    shared void setArea(Float area) {
        radius = sqrt(area / pi);
    }
}

value circle = Circle(4.0);
circle.setArea(10.0);
print(circle.getArea());

但我希望能够提供对属性的类似属性的访问:

value circle = Circle(4.0);
circle.area = 10.0;
print(circle.area);

我如何在锡兰做到这一点?

【问题讨论】:

    标签: properties ceylon


    【解决方案1】:

    Getters 的声明就像定义一个没有参数列表的函数一样。然后,getter 主体的行为类似于普通函数,并且必须返回属性的计算值。

    variable String local_var = "Hello world!";
    
    // Getter
    String name1 {
        return local_var;
    }
    
    // Also getter, using functional syntax for body
    String name2 => local_var;
    

    Setters 使用 assign 关键字声明。然后,setter 主体的行为就像一个 void 函数,执行本地环境的任何适当突变,并且不能返回值。可以通过属性名称在正文中引用被分配的传入值。

    // Setter
    assign name1 {
        local_var = name1; // name1 here is value being assigned
    }
    
    // Also setter, using modified functional syntax
    assign name2 => local_var = name2;
    

    与大多数编程语言不同,属性可以是包的顶级成员,而不仅仅是类的成员:

    class Circle(shared variable Float radius) {
        // Class-level getter
        shared Float area {
            return pi * radius ^ 2;
        }
    
        // Class-level setter
        assign area {
            radius = sqrt(area / pi);
        }
    }
    
    Circle window = Circle(1.0);
    
    // Top-level getter
    Circle outer_window => Circle(window.radius * 2);
    
    // Top-level setter
    assign outer_window => window.radius = outer_window.radius / 2;
    

    【讨论】:

      【解决方案2】:

      补充说明:在 Java 后端,Ceylon getter 和 setter 编译为 Java getter 和 setter(使用标准的 getFoo/setFoo 名称,或 isFoo 用于 Boolean 属性)。强烈建议不要定义命名为 getter 和 setter 的常规函数​​,例如问题中的 getAreasetArea,如果您确实定义了它们,它们的支持函数实际上将被称为不同的名称(例如 $getArea)避免与编译器自动生成的getter和setter发生冲突。

      【讨论】:

        猜你喜欢
        • 2018-11-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-28
        • 1970-01-01
        • 1970-01-01
        • 2023-03-25
        • 2016-02-11
        相关资源
        最近更新 更多