overiding mutable methods in immutable classes

anonymous via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Sat Nov 22 10:24:01 PST 2014


On Saturday, 22 November 2014 at 17:40:42 UTC, Eric wrote:
> Yes, but this is what I really want:
>
> class X(T : immutable Object)
> {
>     private T x;
>     this(T x) pure { this.x = x; }
> }
>
> class Y
> {
>     private int x;
>     this(int x) pure { this.x = x; }
> }
>
> void main()
> {
>     immutable(Y) y = new immutable Y(5);
>     X!(Y) x = new X!(Y)(y);
> }
>
> // test.d(16): Error: template instance X!(Y) does not
> // match template declaration X(T : immutable(Object))

I'm not sure what you're getting at. That is, I don't see which
parts of the code you want to be as they are.

For example, this works:

class X(T /* optionally, restrict T to class types:*/ /*: const
Object*/)
{
       private T x;
       this(T x) pure { this.x = x; }
}
/* Maybe add a convenience construction function: */
X!T newX(T)(T x) {return new X!T(x);}

class Y
{
       private int x;
       this(int x) pure { this.x = x; }
}

void main()
{
       immutable(Y) y = new immutable Y(5);
       X!(immutable Y) x = new X!(immutable Y)(y);
       auto x2 = newX(y); /* same as above, but less wordy */
}

But I'm not sure if maybe I changed to much about it.

My point is, that I think it's generally a good idea to be
flexible when possible, and not make (im)mutability demands
unless actually necessary.

You may know the following, but I feel like there may be some
confusion about it: Note that immutable(Y) is a different type
from just Y. And declaring Y as `immutable class Y` wouldn't
change a thing about that, as the "immutable" there only affects
the members of Y. Objects of the bare type Y would still be
(head) mutable.


More information about the Digitalmars-d-learn mailing list