クラスをどうするか

2日ほど研修で東京行ってました。ヒマなときにDiksamのOOの仕様を少々考えたのでメモ。
まず、これは前々から考えていたことですが、継承について。

  • abstractなクラス以外は継承不可
  • メソッドはデフォルトでnon virtual
  • アクセス修飾子はpublicとprivate。デフォルトはpublic。protectedはつけない。
  • オーバーライドするときは、オーバーライドする側でもoverrideと書く(C#流)。

要するに何を言っているかというと、「それが期待されているところ以外では、継承でスーパークラスの動作を変えることはできない」ということです。異論があるのは承知の上ですが、意図されないところまでサブクラスがスーパークラスに踏み込んでは、全体の整合性が維持できないと考えるためです。
アクセス修飾子のデフォルトは今のところpublicにしていますが、「該当ソースファイル内のみ」とかの方がよいかもしれません。
また、もうひとつ考えていることとして、

  • クラスは、仕様部分と実装を分けて書けるようにしたい。

という点もあります。
以前にも書きましたが、インタフェースとしてのヘッダファイルは実装よりも先に書きたいわけです。C++なら、先にヘッダファイルを公開しておいて、(インラインでない)メソッドは後から書くことができます。が、通常privateにするデータメンバが仕様たるべきヘッダファイルに行ってしまっているのが気に入らない。
純粋仮想関数しかないクラス(Javaならインタフェース)をヘッダファイルに書き、実装側で継承するという方法もありますが、この目的で継承なりインタフェースなりを使うと、公開側のクラスなりインタフェースなりが継承関係を持っている場合、あっさり反復継承になってしまうのが気に入らない。また、コンストラクトするためにcreate_xxx()関数を用意することは可能だが、どうせなら普通にnewしたい。なので、1:1前提でよいから、クラスを仕様と実装に分けて書きたいな、と。実装のバインドを実行時に行うようにすれば、テスト時はスタブと結合できますし。
あ、そうそう、

  • staticメンバはなし。

関数も静的変数もあるんだから不要でしょ。
他にもいろいろあった気がしますが、ひとまずメモ。