Re: [Vala] [Genie] Object members



Hi,

2009/10/28 Patrick Castle <lemeia bigpond com>:
Just stuffing about at the moment getting my head about creating classes in
Genie. From what I gather, every variable you declare outside of a method is a
member/property of that class.

What I'm finding a bit confusing is there isn't just one way to declare a
property it seems - but both ways don't work consistently.

For example, I have class "Test" and I want it to have a private property "a"
not accessible to external callers. It seems like these are the options:

class Test : Object
   _a : int

or

class Test : Object
   prop private a : int

or

class Test : Object
   prop _a : int
the first one actually defines a field, and the two others are properties

but not

class Test : Object
   private a : int

My first question - is there any reason why that last one shouldn't compile?
I don't think so (actually I don't know the syntax for private fields,
but this seems fine)
Also - why actually have so many ways to declare the same thing? Is it
deliberate or just an accident of the syntax checking?
the field/property thing aside, there is only that a member starting
with an underscrore is implicitly private.

Also - does Genie have the concept of a class variable, or are they all just
instance variables? My initial temptation was to use static in the declaration

class Test : Object
   prop static a : int

This actually starts spitting out all sorts of errors when compiling the C
source, so perhaps it gets further than it should. Is it an illegal declaration?
You can try removing prop (thus creating a field), but I don't think
this should create errors.
And if so, should it be caught before it gets as far as the C source being
created and compiled?
Sure. The rule of thumb here is that a C compiler error is a bug
either in valac or in the vapi (in case you're using a library).

On the Genie homepage it says:
All methods, properties and events can also take modifiers to define further
options.

I assumed that would mean that all modifiers were legal. So I thought I should
try the other modifiers.

abstract:

class Test : Object
   prop abstract a : int

This one compiles OK, but if you create an instance of the class and assign a
value to the property you get a Segmentation Fault when you run it.
this souldn't compile afaik (class Test should be abstract for this to work).

I looked at the definition of abstract and it seems to say that it should not be
defined in the class in which it's declared but only in the subclass. So I
created a subclass and defined it there instead and I still get a clean compile
but a Segmentation Fault when running.
I think it sould be : (I'm not sure about genie syntax for abstract classes)

class abstract Test : Object
    prop abstract a : int

class Test2 : Test
    _a : int
    prop override a: int
        get
            return _a
        set
            _a = value


I'm guessing that this is only meant for methods rather than properties - but if
so, it would probably be a good idea to make a distinction on the web page
between method modifiers and property modifiers. Seems like the remaining
modifiers look relevant only to methods as well.
abstract, virtual and override should work for properties as well, the
only thing I see as method only is async. (and readonly is property
only)

Also - I think rather than getting a Segmentation Fault, improper use of these
modifiers should probably throw exceptions during the compile.
absolutely.

So to summarise, declaration of properties implies public access unless keyword
private is used (or underscore). Your options are: _var, prop private var, prop
_var.
your options are prop _var or prop private var, but generally you
wouldn't use a private property (unless you need some processing) but
rather private field. (or a readonly property if you don't want the
property to be modified)

There is no such thing as a class variable in Genie.
there should be both class variables and static variables (I'm not
sure about the difference, but I think that class variables are
specific to a class, so althought they are inherited, they don't
necessarily have the same value in a subclass)

HTH,
Abderrahim



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]