Boost logo

Boost :

From: Herve Bronnimann (hervebronnimann_at_[hidden])
Date: 2006-11-29 12:25:48


 
On Wednesday, November 29, 2006, at 07:54AM, "Maarten Kronenburg" <M.Kronenburg_at_[hidden]> wrote:
>> The unsigned integer inherits from the signed one. While this does model
>>arithmetics correctly (a natural number is an integer, after all), it is the
>>unsigned integer that has richer functionality. It's clumsy and not
>>extensible to use inheritance in such a case.
>
>The normal and the unsigned integer have the same functionality, only the
>implementation is slightly different.

I've heard this often enough since the beginning of this discussion, and imho it's a major source of confusion and problems in the design. Google "Liskov Substitution Principle", "ISA Relationship" or other similar keywords, for more information. The famous example is Shape/Rectangle/Square (read http://www.objectmentor.com/resources/articles/lsp.pdf for a good discussion).

So I have to say this loud and clear: a natural number <NOT> "is a" </NOT> integer. It is not, no more than a modular one is. Try subtracting 1 to 0, and you will not get the same behavior in either three types. This violates the LSP (Liskov Subst. Princ. mentioned above)

However, a const_unsigned_integer "IsA" const_integer, so long as you can't modify the value. Thus if you think of integer as a value semantic type, all is well in your relationships, but the presence of operator--, etc. dictates that unsigned_integer and integer should be unrelated classes. There is a hierarchy, equivalent to the famous example of Shape/Square/Rectangle, where (loosely speaking, and without syntactic rigor):
    class const_integer;
    class const_unsigned_integer : public const_integer; // a natural number is an integer, when talking about value semantics
    class integer : public const_integer;
    class unsigned_integer : public const_unsigned integer;
But note that the fourth side of the rectangle (unsigned_integer: public integer) is *not* provided.

The same goes even more drastically with modular_integer where some operations (operator<) don't make real sense.

I think this was mentioned back in June, perhaps not in such details, but I remember some people objecting to the inheritance back then. I think you should think about this seriously, Maarten, since imho it's a major flaw in your design, not taking any position on allocators or other issues. I don't have a particular opinion about how to fix the proposal, but I just want this forum to be at least aware of the issues.
Regards,

--
Herve Bronnimann
   

Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk