Don wrote:
Andrei Alexandrescu wrote:
Walter and I just discussed the matter of inheriting constructors. Our thought on the issue:

a) If a class doesn't define any constructors and adds no fields, inherit constructors. Example:

class MyException : Exception {}

b) If a class defines at least one constructor, do not inherit constructors.

c) If a class doesn't define any constructors but does add at least a non-static field -> undecided.

What do you think?

Andrei

I would add: "and the class does not define a class invariant".

A constructor exists to establish the class invariant (even if that invariant is implicit). For (a), the old invariant will still be satisfied. In the case (c) there is a chance that the invariant will not be appropriate. In (c), I suggest that it is valid to inherit constructors if and only if the new class is a simple aggregate of the old class, together with the new members (which may have invariants of their own). If there's no constructor and no invariant, then either it's a simple aggregate, or it's a bug.



Good point. I do think of classes that add fields that don't mess up the invariant though:

class MyException : Exception {
    private int sysCode;
    invariant() { assert(sysCode < 100); }
}

If default initialization of the field puts it in a state that respects the invariant, there isn't a problem.


Andrei

Reply via email to