継承のために設計し、文書化する。そうでなければ継承を禁止する

http://www.atmarkit.co.jp/fdotnet/bookpreview/codecomp2nd_index/codecomp2nd.html
http://www.atmarkit.co.jp/fdotnet/bookpreview/codecomp2nd_06/codecomp2nd_06_05.html

■ 継承のために設計し、文書化する。そうでなければ継承を禁止する
継承はプログラムの複雑さを増大させる危険なテクニックである。Javaの第一人者であるJoshua Blochが言うように、「継承のために設計し、文書化する。そうでなければ継承を禁止する」こと。クラスが継承されるような設計になっていなければ、そのクラスを継承できないようにする。つまり、C++であれば、そのクラスのメンバをvirtualで定義しない。Javaであれば、finalで定義する。Visual Basicであれば、Overridableにしない。

見通しのよいプログラミングをする上で、継承というのは、なんだか気持ちの悪い仕組みに感じることも少なくないです。基底クラスで、オーバーライド可能なメソッドが10も20も定義してあるのを見たり、継承ツリーが10段にもなっているものを見たりすると、げんなりしてしまいます。
私が好きな継承は、下のようなシンプルな感じの継承です。

interface DataBaseObject
{
  void save(Connection con);
  void load(Connection con);
}
class DataBaseObjectHelper
{
  final String tableName;
  final int getSequenceID() {...}
  final int doInsertOrUpdate(int id, String insSql, String updSql) {...}
}
class Employee extends DataBaseObjectHelper implements DataBaseObject
{
  void save(Connection con) {...}
  void load(Connection con) {...}
}
class Department extends DataBaseObjectHelper implements DataBaseObject
{
  void save(Connection con) {...}
  void load(Connection con) {...}
}
class Company extends DataBaseObjectHelper implements DataBaseObject
{
  void save(Connection con) {...}
  void load(Connection con) {...}
}