Garbage Collection

塵も積もれば山

目次

Blog 利用状況

ニュース

コミケで受けていた通販をすべて発送しました。詳しくはこちらの記事にて
C++とかC#とか数学ネタを投下していく予定です。
それ以外の日々の四方山話を綴った日記はこちら

書庫

日記カテゴリ

[言語]private不要論

以前、privateは不要、という事を言ったことがあります。
privateというのはアクセス修飾子のことです。

privateはなくして、protected扱いにする。
そして関数はすべてvirtualがついたものとする。
これがprivate不要論の趣旨です。
要するに、派生クラスは基底クラスを自由に扱えるべきだ、という考えです。

Aというクラスに機能を追加したBというクラスを作ることができる、という説明を見て、
機能追加したくても、アクセス修飾子でガードされれていたら手が出ない、と思ったからです。

しかし、これは大きな間違いでした。
正しいアプローチとしては、基底クラスそのものを書き換えてprivateを外したりsetterを作ればいいのです。
もし、ソース編集の権利がなければ、再作成するしかないのです。

派生ってのは関数の引数と同じようなものと考えられます。
引数にない項目に対しては変更できないと同じように、
書き換えられるもの、書き換えられないものというのが派生した場合にも存在するわけです。

ただ、private不要論の発端だけは間違ってないような気がしていました。
そのきっかけがC#のsealedで、派生禁止というアプローチがあったんだ!と気付きました。
(Javaの方が先だと思うけど、私が知った順序なので。)

基底クラスはどのように派生して使われるべきか設計段階で盛り込む必要があります。
だったら、派生のことを考えていないクラスに対して派生するのがそもそもおかしいわけです。

ということで、デフォルトでは派生禁止論を推します。

#仮に派生可能というキーワードがあったらなんだろう…deriveable ??

投稿日時 : 2008年9月6日 0:59

Feedback

# re: [言語]private不要論 2008/09/06 1:20 凪瀬

Javaだとfinalキーワードをclassにつけることで継承不可能なclassを作ることができます。

が、デフォルト継承不可だとなんというか窮屈というのが多い意見のよう。

もっとも、継承されることを前提にしたclassでないと、継承してうまく活用できないわけで、結局のところスーパークラスに手を入れることになるわけなのですが・・・

自分に編集権のないclassをいざと言うとき継承などを利用してどうにかするということができないと窮屈、というわけです。

想定される継承はよしとして、こうした黒魔術的な継承はできることなら避けられるべきなのですが、清廉潔白というのも辛いというのが人情と言うわけですね。

# re: [言語]private不要論 2008/09/06 10:58 かたぎり

オオサカのおばちゃん状態で、「あ、このクラス使えそう。借りちゃえー!」で派生させてサブクラス作っちゃう(笑)派生大好き人間が通りますー♪
いや、なんとなくね、あると使っちゃう、みたいにWindows用コントロールクラス派生しまくりwをしているVB.NETな人なのでアレですが←おい

設計段階で、こいつは派生元、こいつは派生させるな、こいつはスーパークラスな、なんて分けて考えていても、いざ作っていくとなぜか壊れていっちゃうというか、現場で血は流れてる感じはする<おい


# re: [言語]private不要論 2008/09/06 11:09 通りすがり

サードパーティの製品なんかが編集権のないよい例ですよね。
継承可でマニュアルに継承の記述まであるところもあれば一切継承不可な実装のものもあって使う側としてはやはり継承させて貰いたいなぁと思うことが多いです。

# re: [言語]private不要論 2008/09/06 11:42 出水

てかね、派生じゃなくて所有でいいじゃん、って思うわけですよ。
Javaは関数がvirtualなのでまだなんとかなるとしても、
C++の場合はvirtualなしデストラクタという問題があるんで無理やり派生は破綻一直線です。

しかし、意外にも派生不可は不評ですね。
仮に、普通の派生とは別にジャイアン派生(private無視)ってのを作れば有りなのか無しなのか…

タイトル  
名前  
Url
コメント