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