D - some (Object related) questions
- Ivan Senji (22/22) Apr 12 2004 Why does class Object have opEquals?
- Vathix (12/37) Apr 12 2004 opEquals exists because it's often faster to compare for equality. Use
- Ivan Senji (8/45) Apr 12 2004 But why is this a basic implementation? Is it really necessary?
- Andy Friesen (17/30) Apr 12 2004 I wish it didn't. It's because of this that
- Ivan Senji (13/23) Apr 13 2004 So is there anything that we would lose if opEquals an opCmp weren't def...
- Russ Lewis (2/18) Apr 13 2004
- Ben Hinkle (9/22) Apr 13 2004 There is a little "compiler helper" in src/phobos/internal/obj.d
Why does class Object have opEquals? Inside this function it just checks this===o; This can cause problems! For example i am writing a class and accidentally forget to write opEquals or misspell it (opEguals or something) Then i try to compare two objects, i write a==b and since i didn't write opEquals the one from Object is used and my objects are in fact compared for identity. If i wanted to do that i would have written a===b or a is b, but it isn't what i wanted! Is this a potential cause of bugs or are there good reasons for Object to have opEquals and opCmp(this one does adress-comparing and if i wanted to do this i would write &a==&b) A related question: How can i make demands on my template type? How do i require a template type to have opEquals defined (a real one and not just the one from Object)? Is there a way to express general requirements like having opAdd defined..? Please forgive me for asking so many (maybe stupid) questions! :)
Apr 12 2004
Ivan Senji wrote:Why does class Object have opEquals? Inside this function it just checks this===o; This can cause problems! For example i am writing a class and accidentally forget to write opEquals or misspell it (opEguals or something) Then i try to compare two objects, i write a==b and since i didn't write opEquals the one from Object is used and my objects are in fact compared for identity. If i wanted to do that i would have written a===b or a is b, but it isn't what i wanted!opEquals exists because it's often faster to compare for equality. Use the override keyword to make sure you're overriding a function.Is this a potential cause of bugs or are there good reasons for Object to have opEquals and opCmp(this one does adress-comparing and if i wanted to do this i would write &a==&b)It's just a basic implementation (for a basic Object), that's why you're supposed to override them to do other things based on your class, such as comparing a member string.A related question: How can i make demands on my template type? How do i require a template type to have opEquals defined (a real one and not just the one from Object)? Is there a way to express general requirements like having opAdd defined..?An interface can do this. Look at the bottom of http://www.digitalmars.com/d/class.html#interface -- "A reimplemented interface must implement all the interface functions, it does not inherit them from a super class".Please forgive me for asking so many (maybe stupid) questions! :)-- Christopher E. Miller
Apr 12 2004
"Vathix" <vathix dprogramming.com> wrote in message news:c5f63k$18na$1 digitaldaemon.com...Ivan Senji wrote:But why is this a basic implementation? Is it really necessary? Why is opEquals defined like identity? For this we have identity operator === or is. Why is opCmp defined like comparing adresses? This can be done by actually comparing adresses.Why does class Object have opEquals? Inside this function it just checks this===o; This can cause problems! For example i am writing a class and accidentally forget to write opEquals or misspell it (opEguals or something) Then i try to compare two objects, i write a==b and since i didn't write opEquals the one from Object is used and my objects are in fact compared for identity. If i wanted to do that i would have written a===b or a is b, but it isn't what i wanted!opEquals exists because it's often faster to compare for equality. Use the override keyword to make sure you're overriding a function.Is this a potential cause of bugs or are there good reasons for Object to have opEquals and opCmp(this one does adress-comparing and if i wanted to do this i would write &a==&b)It's just a basic implementation (for a basic Object), that's why you're supposed to override them to do other things based on your class, such as comparing a member string.OK thanks this helps :)A related question: How can i make demands on my template type? How do i require a template type to have opEquals defined (a real one and not just the one from Object)? Is there a way to express general requirements like having opAdd defined..?An interface can do this. Look at the bottom of http://www.digitalmars.com/d/class.html#interface -- "A reimplemented interface must implement all the interface functions, it does not inherit them from a super class".Please forgive me for asking so many (maybe stupid) questions! :)-- Christopher E. Miller
Apr 12 2004
Ivan Senji wrote:Why does class Object have opEquals?I wish it didn't. It's because of this that Object a, b; if (a == b) is perfectly legal code that will cause an access violation every time it is executed. (a is null, so a.opEquals cannot be called withoun violating the invariant that says 'this' must not be null)Inside this function it just checks this===o; This can cause problems! For example i am writing a class and accidentally forget to write opEquals or misspell it (opEguals or something)I always use the override keyword when overriding things. (it causes a compiler error if the method does not override something in the parent)A related question: How can i make demands on my template type? How do i require a template type to have opEquals defined (a real one and not just the one from Object)? Is there a way to express general requirements like having opAdd defined..?In more mundane situations, you can fake it with something like this: class Foo(T) { // you don't ever have to actually call this. private static bool hasEquals() { return new T() == new T(); } } In the case of Object.opEquals, though, I don't know.Please forgive me for asking so many (maybe stupid) questions! :)psh. Far, far dumber questions have been asked. Show us your worst! :) -- andy
Apr 12 2004
"Andy Friesen" <andy ikagames.com> wrote in message news:c5g2bh$2kmf$1 digitaldaemon.com...Ivan Senji wrote:So is there anything that we would lose if opEquals an opCmp weren't defined in Object. The way i see it it would elliminate some problems like the one you mentioned. Plus: this definition of opEquals checks for identity and we allready have a good (better!) way for testing this!Why does class Object have opEquals?I wish it didn't. It's because of this that Object a, b; if (a == b) is perfectly legal code that will cause an access violation every time it is executed. (a is null, so a.opEquals cannot be called withoun violating the invariant that says 'this' must not be null)psh. Far, far dumber questions have been asked. Show us your worst! :) -- andyThank for the understanding. Recently i don't have much time to write a lot of D code so i have to do a lot of D-thinking, and this can cause stupid question, when you have something in your head and don't have the time to try it! :)
Apr 13 2004
Ivan Senji wrote:So is there anything that we would lose if opEquals an opCmp weren't defined in Object. The way i see it it would elliminate some problems like the one you mentioned. Plus: this definition of opEquals checks for identity and we allready have a good (better!) way for testing this!Yeah, it would mean that we couldn't write overrides in children.psh. Far, far dumber questions have been asked. Show us your worst! :) -- andyThank for the understanding. Recently i don't have much time to write a lot of D code so i have to do a lot of D-thinking, and this can cause stupid question, when you have something in your head and don't have the time to try it! :)
Apr 13 2004
Andy Friesen wrote:Ivan Senji wrote:There is a little "compiler helper" in src/phobos/internal/obj.d called _d_obj_eq that does the right thing w.r.t. null. I can't tell if it is ever used, though. When I call it directly instead of == it works fine. I don't know if that helper was just not finished or if it was abandoned. -Ben ps. for the curious _d_obj_eq is just return o1 === o2 || (o1 && o1.opEquals(o2));Why does class Object have opEquals?I wish it didn't. It's because of this that Object a, b; if (a == b) is perfectly legal code that will cause an access violation every time it is executed. (a is null, so a.opEquals cannot be called withoun violating the invariant that says 'this' must not be null)
Apr 13 2004