On 2015-09-08 18:40, Jonathan M Davis wrote:

Well, it might be a bit annoying, but it's simply a matter of adjusting
your code to call opEquals explicitly when trying to call the base
version

Given that fact that I found this problem in std.xml.Document shows either that this is not so easy to remember or that std.xml is basically never used and it doesn't have a test for this. That it doesn't have a test is true regardless.

,whereas without the free function opEquals, you have subtle
correctness problems. For instance, if you have base == derived and
derived == base, you'll get the same result for both for D, whereas the
equivalent Java or C# could would likely not, because the free function
opEquals checks both lhs.opEquals(rhs) and rhs.OpEquals(lhs) whether you
did base == derived or derived == base.

So, while what we have is by no means perfect, I think that it is an
improvement over what Java and C# did.

It should be possible for the compiler to see that it's a super call and generate a call to opSuperEquals (or similar) instead, which would make a non-virtual call when calling opEquals on the instance.

--
/Jacob Carlborg

Reply via email to