encapsulation · API design


This is the opposite attitude to DesignedInheritance. Advocates of open inheritance do not look to disallow inheritance by Sealing their classes or doing anything else to stop people inheriting classes.

Fans of open inheritance don't disagree with designed inheritance fans about the dangers of inheritance. Inhertiance is an initmate relationship with plenty of dangers for the unwary. You can easily break superclass behavior and you have to be expecially wary of upgrades since you can be relying on hidden implementation details. But open inheritors belive that the choice of whether to take on those risks should be the decision of the users of the library. If they choose to inherit, then they accept the risks and the consequences.

A designed approach is in theory better, but the problem is that it's very hard to figure out all the ways in which someone can usefully vary an existing class. This leads to two problems: library users can't use a library in a way that the designer didn't anticipate and library designers have to take on the responsibility of trying to anticipate extensions.

Designed inhertance assumes that library writers are wiser than their users. Often this isn't the case. Library writers make mistakes too, if inheritance is open then the user of the class has the opportuntity to fix them and still take advantage of the library writers hard work.

Designing for inheritance is a very tricky task, particularly as you usually don't know what the use cases are. Asking people to think through all inheritance cases places a big burden on library writers. Open inheritance means they don't have to deal with it unless they specfically want to, with the proviso that those that do inherit have to be careful about what they are doing.

One area that particularly causes trouble for designed inheritance is testing. Often with testing you need to use a TestDouble, but are prevented by a sealed class with no interface that you can use for substitution. These kinds of APIs can be Detestable

Open inheritors often do design classes with intended extension points that are safer to use than others. However they usually mark these through naming or documentation rather sealing them. That way people are pointed to the safe areas but not prevented from overriding elsewhere if necessary.

Often design inheritance comes with a DirectingAttitude, which usually forgets that fools are ingenious when it comes to messing things up.