- - PR -
interface のメソッドは、なぜ protected にできないのでしょうか?
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2003-07-21 04:35
yamasaです。
# 前回の書き込みから大きく間があいてしまいましたが…
class と interface の類似性なんて強調する必要があるのでしょうか? 確かに表記などの類似点はありますが、class と interface は 概念的には全く別個のものだと思います。 だからこそ、Java では class の継承と interface の実装をわざわざ extends と implements という別々のキーワードで区別しているのでしょうし。 interface はあくまで「(一般的な意味での)公開インターフェース」を定義するために 導入されたものであって、多重継承の代替ではないと認識すべきだと思います。 | ||||||||
|
投稿日時: 2003-07-21 09:40
unibon です。こんにちわ。
以下、仮定になりますが、たとえば、 abstract class Foo { abstract public void bar(); abstract public void hoge(); } という abstract class だったら、全部のメソッドが abstract であり、 interface に成りうる条件を満たしているので、 それを interface という特別な名前で表現しなおして、 interface Foo { abstract public void bar(); abstract public void hoge(); } と表記し直しているだけ、 すなわち、わざわざ interface を区別して表記することは必須ではない、 としても、実質的な違いはないと思います。 この class をパッと見たとき(あるいは多重継承になってしまっているかを コンパイラがチェックする際)にすべてのメソッドが abstract か調べるのが面倒なので、 それが一目瞭然となるように interface としてソースコード中で 明示できるようにしているだけであり、 概念的な違いはない、としても言語仕様としては問題ないと思います。
「多重継承の代替」ではないと思いますが、「継承の代替」ではあると思っています。 また、interface で良く語られる「公開インターフェース」という意味中の「公開」は、 暗黙のメソッド修飾子が public であることから由来しているような気がします。 interface は「公開インターフェース」だから暗黙のメソッド修飾子が public になっているのではなく、 interface の暗黙のメソッド修飾子が public だけだから自ずと「公開インターフェース」になってしまう、 のだと思っています。 | ||||||||
|
投稿日時: 2003-07-21 12:31
横から失礼します。
classとinterfaceを区別して表記するのは大きな意味があると思います。 class(abstract class)=オブジェクト(人・物など) interface=役割(又は責務) なのでまったく別のものですよね? 例えば「掃除係」をモデリングする場合、abstract classではおかしいですよね? 「掃除係」はオブジェクト(人・物など)では無いですから。 (実装上「掃除係」クラスを作成する事はあるかもしれません) [ メッセージ編集済み 編集者: ぽん 編集日時 2003-07-21 13:57 ] | ||||||||
|
投稿日時: 2003-07-21 22:03
abstract class は最低一つのコンストラクタを持ちます(明示的に宣言しない場合は自動的に実引数を取らない default constructor が提供されます)が、interface はコンストラクタを持ちません。 | ||||||||
|
投稿日時: 2003-07-22 11:37
unibon です。こん○○○。
#以下、仕様を変えようというわけではないですが、 #初心者に説明する際に、こういう方便はどうでしょうか、という案です。 class はコンストラクタを省略できない、という決まりにしても良いかもしれません。 したがって、コンストラクタを書かないものは interface とみなすことになります。 コンストラクタが書いてないと、インスタンスを生成できないというのが、 コード上で見えて分かりやすくなるかな、と思います。 これは、前々から思っていたのですが、 わずか数行のコンストラクタの記述が省略できたからといって、 あまり嬉しく思ったことはないためです。 それよりは、コンストラクタが必要な場面で、 コンストラクタを書かないとエラーになるほうが、 初心者にとっては理解しやすいかなと感じています。 | ||||||||
|
投稿日時: 2003-07-22 16:49
unibon です。こん○○○。
#レレレのおじさんが頭の中でうごめいています。 ご指摘の点を調べていて、参考になりそうなものとして、 http://java-house.jp/ml/archive/j-h-b/007370.html http://java-house.jp/ml/archive/j-h-b/009010.html を見つけました。 #が、長大すぎてまだ全部見ていません。中途ですが、いったん投稿します。 | ||||||||
|
投稿日時: 2003-07-22 19:08
unibonさんの書き込み (2003-07-21 09:40) より:
>すなわち、わざわざ interface を区別して表記することは必須ではない、 としても、実質的な違いはないと思います。 OOPのメリットとして「型と継承の分離」があるのはご存知ですよね? 通常のクラスでは、型と実装の定義をともに含んでいますが、Javaのinterfaceは 型のみを明示的に分離し、また型のみの継承階層を作ることができます。 そのintarfaceに実装の概念(privateやprotected)を入れる必要はないでしょう。 | ||||||||
|
投稿日時: 2003-07-22 19:12
[quote]
ukさんの書き込み (2003-07-22 19:08) より: >OOPのメリットとして「型と継承の分離」があるのはご存知ですよね? 「型と実装の分離」の間違いです。すいません。 |