On 2009-07-25 08:07:56 -0400, KennyTM~ <kenn...@gmail.com> said:
Michel Fortin wrote:
In the other thread, I suggested this, which could aleviate the problem:
int foo.opGet(); // getter
void foo.opAssign(int); // setter
with some support from the compiler.
It could even be exteded to support more:
int foo.opIndex(int); // foo[1];
void foo.opAddAssign(int); / foo += 1;
void foo.invert(); // special function attached to property
Basically, all you need to implement properties is not a dedicaced
"property" syntax, it's a syntax to implement some kind of local
namespace, and am "opGet" or "opValue" operator for representing the
local namespace. It could also be expressed like this:
namespace foo {
int opGet(); // getter
void opAssign(int); // setter
...
int opIndex(int); // foo[1];
void opAddAssign(int); / foo += 1;
void invert(); // special function attached to property
}
In both cases, the result would be the same:
foo = 1; // same as foo.opAssign(1);
return foo; // same as return foo.opGet();
If property is going to be extended like this, why not just make a
nested struct. Works even now.
Close, but a nested struct doesn't have access to the outer class, nor
can you override its functions in a derived class. I'd say what I'm
proposing is closer to a named mixin:
class Z
{
int x;
template Property()
{
void opAssign(int v) { x = v; }
void opAddAssign(int v) { x += v; }
int get() { return x; }
alias get this;
}
mixin Property property;
}
Z z = new Z;
z.property = 1; // works!
What doesn't work here is the "alias get this" line: you're still
forced to explicitly call the getter. And I have the feeling that
overriding in a derived class won't work either.
Oh and the syntax isn't great at all.
--
Michel Fortin
michel.for...@michelf.com
http://michelf.com/