All right, all right! Interim decision regarding qualified Object methods

Jonathan M Davis jmdavisProg at gmx.com
Thu Jul 12 00:59:16 PDT 2012


On Thursday, July 12, 2012 00:15:48 Andrei Alexandrescu wrote:
> What say you?

If you can figure out how to make this work, it's fine by me.

However, I see two potential issuses which cause currently working idioms to 
no longer work:

1. Anything which wants to be able to operate on Objects generically (e.g. 
have a container full of Objects) is going to have problems, since comparison 
and hashing won't work anymore. For the standard stuff, at minimum, that will 
screw up being able to put Object in AAs and RedBlackTree. For 3rd party 
containers which decided to go the Java route of containing Objects, they risk 
being completely screwed.

For the most part, I think that operating on Objects like that is horrible, 
and we certainly don't encourage it, but it's been possible for ages, so I'm 
willing to bet that there's plenty of code which does it. For instance, what's 
Tango do? As I understand it, they're fairly Java-esque in their general 
approach to things, so it wouldn't entirely surprise me if their containers 
held Object rather than being templated (though the need to hold primitive 
types may have made it so that they didn't go that route).

I don't know whether that inability to do anything with Object beyond hold it 
- no comparison, no nothing - is really acceptable or not. It wouldn't mess up 
anything _I_ do, because I abhor operating on Object - it throws away too much 
type information and encourages bad practices (such as having a container full 
of unrelated types which happen to have the same base class) - but plenty of 
other people do it, and it won't be possible anymore.

2. Will this work with toString? How much stuff relies on being able to get a 
string from Object? We've been switching everything in Phobos over to use 
variadic templates, which should make it easy enough to get around that 
problem (presumably, classes are then in the same boat as structs which don't 
define toString), but we may have older functions which will run into problems 
with this, and some stuff in other libraries could be completely screwed by 
this. Again, what does Tango do? Does it use variadic templates for its print 
function, or does it use D style variadics? At first glance, it seems to me 
that getting rid of toString on Object would screw over its use with D style 
variadics. That may or not be true, but if it is, we're closing doors on stuff 
which currently works.

So, I think that it's probably a solid way to go, and it does appear to solve 
the const issues that we've been having quite nicely, but it also appears to 
break a number of things which have worked for some time, and we're going to 
have to figure out how we're going to deal with that, even if it's only 
providing a good deprecation path.

- Jonathan M Davis


P.S. I think that we should still keep how the free function opEquals 
currently works with regards to comparing Objects of differing types. The 
comparison won't work with Object anymore, but classes which have opEquals 
will still have polymorphic opEquals, and I think that all of that great logic 
that we thought up to solve some of the problems that Java has with that 
should be kept. So, if anyone was thinking that that only existed because 
Object has opEquals on it and that it would be unnecessary now, I completely 
disagree.


More information about the Digitalmars-d mailing list