Larry Luther: > void copy (in A a) { In D2 it's better to use "const" or "immutable" instead of "in".
Here's one version of the code const-aware: import std.stdio: writeln; import std.string: format; template ExceptionTemplate() { this() { super(this.classinfo.name); } this(string msg) { super(this.classinfo.name ~ ": " ~ msg); } } class ArgumentException: Exception { mixin ExceptionTemplate; } class A { int x, y; this(int xx, int yy) { this.x = xx; this.y = yy; } void copyFrom(const Object other) { const o = cast(typeof(this))other; if (o is null) throw new ArgumentException("Some message here..."); x = o.x; y = o.y; } override string toString() const { return format("A(%d, %d)", this.x, this.y); } } class B : A { int z; this(int xx, int yy, int zz) { super(xx, yy); this.z = zz; } override void copyFrom(const Object other) { const o = cast(typeof(this))other; if (o is null) throw new ArgumentException("Some message here..."); super.copyFrom(other); z = o.z; } override string toString() const { return format("B(%d, %d, %d)", this.x, this.y, this.z); } } void main() { B foo = new B(1, 2, 3); B bar = new B(4, 5, 6); writeln("foo = ", foo); writeln("bar = ", bar); foo.copyFrom(bar); writeln("foo = ", foo); writeln("bar = ", bar); } Bye, bearophile