精灵的写作财产

时间:2016-01-22 04:34:11

标签: class properties genie

我是从http://mobilemerit.com/android-app-for-usb-host-with-source-code/

阅读的

for readonly:vala

public int b { get; private set; }

in Genie:

prop readonly b: int

for writeonly: VALA:

public int b { private get; set; }

精灵: [此行:语法错误]

prop writeonly b: int

如何在Genie中声明单行 writeonly 属性? 也许是这样的?

prop XXX b: int

我们可以写一个四行写的属性:

class Wonly
    _b: int
    prop b: int
        set
            _b = value

init
    var w = new Wonly
    // print w.b // ERROR!! writeonly!!
    w.b = 456   // OK

但是如何编写一行的writeonly属性?

1 个答案:

答案 0 :(得分:2)

我会尽力在这里回答你的问题,但问题的某些方面并不清楚。也许有助于提供更多的上下文,更好地解释您计划实现的目标以及更多用于上下文化的代码。

那就是说,我假设你在询问Genie中类属性的语法。

属性是隐藏您开发的类的用户的实现细节的方法。根据Vala的tutorial,这一举动也被称为计算机科学中的information hiding principle

在Vala中,属性将按以下方式定义:

static int current_year = 2525;
class Person : Object {
    private int year_of_birth = 2493;

    public int age {
        get { return current_year - year_of_birth; }
        set { year_of_birth = current_year - value; }
    }
}

在Genie中,它看起来像这样:

class Foo : Object

    prop name : string

    prop readonly count : int

    [Description(nick="output property", blurb="This is the output property of the Foo class")]    
    prop output : string
        get
            return "output"
        set
            _name = value

现在为只写属性。根据SO的thisthis问题,这是一个有争议的问题。它似乎只有在你不打算阅读你写的内容时才有用。但正如您在上述问题中所看到的,大多数答案都建议创建方法而不是使用只写属性。

这将我们带到您指向的语法:

public int b { private get; set; } 

您声明这是Vala中只写属性的语法,似乎是真的。这是因为,通过将get设置为private,可以防止用户读取该值。您可以将其中的get或set设置为私有,方法是将其保留在set set之外,即在Vala中,您只需删除 private get 部分。

现在这是我不确定的地方,但我建议你在代码中尝试一下。基于Vala通过从集合块中删除它们来设置私有getter或setter的能力,我怀疑这同样适用于Genie。

我从以下代码中删除了get的设置并编译:

[indent=4]

class Foo : Object

    prop name : string

    prop readonly count : int

    [Description(nick="output property", blurb="This is the output property of the Foo class")]
    prop output : string
        set
            _name = value

init
    var foo = new Foo()

也许这就是你要找的东西,但我不确定它是否适用于实际代码。如果没有,也许你会用方法做得更好。