Can I make a variable public and readonly (outside where was declared) at same time?
AsmMan via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Sat Sep 27 12:35:51 PDT 2014
On Friday, 26 September 2014 at 18:18:45 UTC, Steven
Schveighoffer wrote:
> On 9/26/14 1:36 PM, "Marc =?UTF-8?B?U2Now7x0eiI=?=
> <schuetzm at gmx.net>" wrote:
>
>> Alternatively, you could create a union with a private and a
>> public
>> member with the same types, but I wouldn't recommend it.
>> Besides, the
>> members would need to have different names:
>>
>> class Foo {
>> union {
>> private int a;
>> public int b;
>> }
>> }
>
> Hm.. that doesn't provide readonly access to either a or b.
>
> But it gave me an idea:
>
> class Foo {
> union {
> private int _a;
> public const int a;
> }
> void setA(int x) { _a = x; }
> }
>
> Hot damn! It works too :) Can't access _a from outside the
> module, can access a, but can't write it (even from within
> Foo). It's like an auto-inlined property function.
>
> I don't know how it would affect the optimizer, or the GC
> scanner. Unions are ugly things...
>
> -Steve
This is really a loot cool and works. Thanks. If private in D had
same behavior like in C#/C++, ie, private to scope of where class
was declared and not public to the entire module, I guess we
could even do:
class Foo {
union {
private int a_;
public @property int a() {
return a_;
}
private @property void a(int value) {
a_ = value;
}
}
//no one need knows the 'a_' (ugly?) identifier
void setValue(int x)
{
a = x;
}
}
And then
Foo f = new Foo();
f.a = 10; // give a compile error becaus it is private and
acessible within Foo class only
BTW: I'm not sure about memory usage where using properties. But
it is still cool.
More information about the Digitalmars-d-learn
mailing list