On Sunday, 22 May 2016 at 03:06:44 UTC, Mike Parker wrote:
On Saturday, 21 May 2016 at 19:17:00 UTC, dan wrote:
Thanks Vit, Meta, and Yuxuan for your speedy help!

So 3 pieces to put together, function, const, and @property (and i guess final for protection against subclasses).

Minimally, there are two pieces to this: a private member variable and a function.

class Foo {
  private int _myVar;
  int myVar() { return _myVar; }
}

The private is necessary because class members in D are all public by default. If it isn't there, then _myVar can be directly modified outside of the module. Be aware, though (if you aren't already), that private members *are* accessible outside of the class in the same module, e.g.:

module foo;

class Foo {
  private int _myVar;
  int myVar() { return _myVar; }
}

void printMyVar() {
    import std.stdio : writeln;
    auto f = new Foo;
    writeln(f);
}

As for 'const' and '@property', neither is strictly a requirement to implement this idiom. Adding const means that you can call the function through const references, but if that's not something you want to allow for some reason, then don't add it.

@property right now doesn't really do anything other than allow for self-documenting code. Perhaps one day it will be fully implemented and require callers to drop the parentheses in calls to @property functions, but for now it doesn't do that. Use it as much as you want, but just understand it isn't necessary for the functionality you are after.

Const *is* necessary to prevent _myVar being written to through code like:

f.myVar = 4;

Of course this isn't necessary for value types, but for reference types.

It's also useful for value types, IMO, for preventing someone from doing this:

f.myVar = 4;

And wondering why the code has no effect.

Reply via email to