That's a great question, and one I remember being curious about when I was writing the comp package, too.
The answer is that while the specs are written such that inheritance is clear, the validation rules are written to be inheritance-unaware. If you look in the core spec, you'll see the same thing--every class that inherits from SBase repeats the same validation rules that it inherits from SBase (such as the one you quote above), for each new class in question. I wasn't there when that pattern was established, but I assume it was done to make validation rules more easily able to stand alone, so that when validating a document, it's clear to the user what specific object had a problem.
It's also true that many elements add to the core namespace attributes that an element may have, so their own rules change to things like, "A Model object may only have the following attributes, all of which are optional: metaid, sboTerm, id, name, substanceUnits, timeUnits, volumeUnits, areaUnits, lengthUnits, extentUnits and conversionFactor." While this can't happen for package elements that inherit from SBase (since packages only add attributes in their own namespace), a package might extend these sub-classes themselves, to get a new object that inherited from Parameter instead of SBase, for example. In those cases, the rule that applied to SBase would not quite apply to the new class, as Parameter added new attributes from the core namespace that could be used.
You do end up with a lot of cutting and pasting, but in the end, I think it's probably best to go ahead and be explicit, and write validation rules that are essentially inheritance-unaware.
-Lucian