Thread overview | |||||||||
---|---|---|---|---|---|---|---|---|---|
|
April 12, 2004 some (Object related) questions | ||||
---|---|---|---|---|
| ||||
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! :) |
April 12, 2004 Re: some (Object related) questions | ||||
---|---|---|---|---|
| ||||
Posted in reply to Ivan Senji | 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 |
April 13, 2004 Re: some (Object related) questions | ||||
---|---|---|---|---|
| ||||
Posted in reply to Vathix | "Vathix" <vathix@dprogramming.com> wrote in message news:c5f63k$18na$1@digitaldaemon.com... > 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. 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. > > 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". OK thanks this helps :) > > Please forgive me for asking so many (maybe stupid) > > questions! :) > > > > > > > -- > Christopher E. Miller |
April 13, 2004 Re: some (Object related) questions | ||||
---|---|---|---|---|
| ||||
Posted in reply to Ivan Senji | 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 |
April 13, 2004 Re: some (Object related) questions | ||||
---|---|---|---|---|
| ||||
Posted in reply to Andy Friesen | "Andy Friesen" <andy@ikagames.com> wrote in message news:c5g2bh$2kmf$1@digitaldaemon.com... > 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) 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! > psh. Far, far dumber questions have been asked. Show us your worst! :) > > -- andy Thank 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! :) |
April 14, 2004 Re: some (Object related) questions | ||||
---|---|---|---|---|
| ||||
Posted in reply to Andy Friesen | Andy Friesen wrote:
> 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)
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));
|
April 14, 2004 Re: some (Object related) questions | ||||
---|---|---|---|---|
| ||||
Posted in reply to Ivan Senji | 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! :) >> >> -- andy > > > Thank 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! :) |
Copyright © 1999-2021 by the D Language Foundation