継承のために設計し、文書化する。そうでなければ継承を禁止する
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) {...} }