On Friday, 26 September 2014 at 17:16:04 UTC, AsmMan wrote:
I know I can combine it by making an extra variable plus a property like this:

class Foo
{
  private int a_;

  void do_something1()
  {
    a_ = baa();
  }

  void do_something2()
  {
    if(cond) a_ = baa2();
  }

  @property int a()
  {
      return a;
   }
}

This is the C#'s to do which I'm translated to D within my limited knowledge. I don't do much OOP, maybe it's possible and I don't know. I'm using @property to make 'a' accessible and readonly at same time but I wanted to do that without this a_ extra variable, i.e, only the methods within the Foo class can assign a new value to a but a instance of Foo can't. An imaginary code example:

class Foo
{
  public MAGIC_HERE int a;

  void do_something1()
  {
    a = baa();
  }

  void do_something2()
  {
    if(cond) a = baa2();
  }
}


And then:

Foo f = new Foo();
writeln(f.a); // output value of a
f.a = 10; // compile error: a is readonly outside Foo's methods.

I hope it's clear (sorry for por English)

The closest you can get is probably this:

    class Foo {
        private int a_;

        @property int a() {
            return a_;
        }

        private @property void a(int value) {
            a_ = value;
        }
    }

You can then assign to `a` inside the class `Foo` _and_ inside its module (because `private` is always accessible from within the same module), while from other modules, it can only be read.

But it's not exactly a read-only variable, because you cannot take an address from it, for example.

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;
        }
    }

Reply via email to