@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

interface のメソッドは、なぜ protected にできないのでしょうか?

投稿者投稿内容
yamasa
ベテラン
会議室デビュー日: 2003/02/15
投稿数: 80
投稿日時: 2003-07-21 04:35
yamasaです。
# 前回の書き込みから大きく間があいてしまいましたが…

引用:

unibonさんの書き込み (2003-07-12 12:46) より:
教えるほうも、class と interface の類似性をより強調できて、楽になります。


class と interface の類似性なんて強調する必要があるのでしょうか?

確かに表記などの類似点はありますが、class と interface は
概念的には全く別個のものだと思います。
だからこそ、Java では class の継承と interface の実装をわざわざ
extends と implements という別々のキーワードで区別しているのでしょうし。

interface はあくまで「(一般的な意味での)公開インターフェース」を定義するために
導入されたものであって、多重継承の代替ではないと認識すべきだと思います。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2003-07-21 09:40
unibon です。こんにちわ。

引用:

yamasaさんの書き込み (2003-07-21 04:35) より:
確かに表記などの類似点はありますが、class と interface は
概念的には全く別個のものだと思います。
だからこそ、Java では class の継承と interface の実装をわざわざ
extends と implements という別々のキーワードで区別しているのでしょうし。


以下、仮定になりますが、たとえば、

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 としてソースコード中で
明示できるようにしているだけであり、
概念的な違いはない、としても言語仕様としては問題ないと思います。

引用:

yamasaさんの書き込み (2003-07-21 04:35) より:
interface はあくまで「(一般的な意味での)公開インターフェース」を定義するために
導入されたものであって、多重継承の代替ではないと認識すべきだと思います。


「多重継承の代替」ではないと思いますが、「継承の代替」ではあると思っています。
また、interface で良く語られる「公開インターフェース」という意味中の「公開」は、
暗黙のメソッド修飾子が public であることから由来しているような気がします。
interface は「公開インターフェース」だから暗黙のメソッド修飾子が public になっているのではなく、
interface の暗黙のメソッド修飾子が public だけだから自ずと「公開インターフェース」になってしまう、
のだと思っています。
ぽん
大ベテラン
会議室デビュー日: 2003/05/13
投稿数: 157
投稿日時: 2003-07-21 12:31
横から失礼します。

引用:

unibonさんの書き込み (2003-07-21 09:40) より:
わざわざ interface を区別して表記することは必須ではない、
としても、実質的な違いはないと思います。



classとinterfaceを区別して表記するのは大きな意味があると思います。

class(abstract class)=オブジェクト(人・物など)
interface=役割(又は責務)
なのでまったく別のものですよね?

例えば「掃除係」をモデリングする場合、abstract classではおかしいですよね?
「掃除係」はオブジェクト(人・物など)では無いですから。
(実装上「掃除係」クラスを作成する事はあるかもしれません)

[ メッセージ編集済み 編集者: ぽん 編集日時 2003-07-21 13:57 ]
お犬様
ベテラン
会議室デビュー日: 2003/01/26
投稿数: 67
投稿日時: 2003-07-21 22:03
引用:
unibonさんの書き込み (2003-07-21 09:40) より:

以下、仮定になりますが、たとえば、

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 を区別して表記することは必須ではない、としても、実質的な違いはないと思います。


abstract class は最低一つのコンストラクタを持ちます(明示的に宣言しない場合は自動的に実引数を取らない default constructor が提供されます)が、interface はコンストラクタを持ちません。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2003-07-22 11:37
unibon です。こん○○○。

引用:

お犬様さんの書き込み (2003-07-21 22:03) より:
abstract class は最低一つのコンストラクタを持ちます(明示的に宣言しない場合は自動的に実引数を取らない default constructor が提供されます)が、interface はコンストラクタを持ちません。


#以下、仕様を変えようというわけではないですが、
#初心者に説明する際に、こういう方便はどうでしょうか、という案です。

class はコンストラクタを省略できない、という決まりにしても良いかもしれません。
したがって、コンストラクタを書かないものは interface とみなすことになります。
コンストラクタが書いてないと、インスタンスを生成できないというのが、
コード上で見えて分かりやすくなるかな、と思います。

これは、前々から思っていたのですが、
わずか数行のコンストラクタの記述が省略できたからといって、
あまり嬉しく思ったことはないためです。
それよりは、コンストラクタが必要な場面で、
コンストラクタを書かないとエラーになるほうが、
初心者にとっては理解しやすいかなと感じています。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2003-07-22 16:49
unibon です。こん○○○。

引用:

ぽんさんの書き込み (2003-07-21 12:31) より:
例えば「掃除係」をモデリングする場合、abstract classではおかしいですよね?
「掃除係」はオブジェクト(人・物など)では無いですから。
(実装上「掃除係」クラスを作成する事はあるかもしれません)


#レレレのおじさんが頭の中でうごめいています。
ご指摘の点を調べていて、参考になりそうなものとして、
http://java-house.jp/ml/archive/j-h-b/007370.html
http://java-house.jp/ml/archive/j-h-b/009010.html
を見つけました。
#が、長大すぎてまだ全部見ていません。中途ですが、いったん投稿します。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2003-07-22 19:08
unibonさんの書き込み (2003-07-21 09:40) より:
>すなわち、わざわざ interface を区別して表記することは必須ではない、
としても、実質的な違いはないと思います。

OOPのメリットとして「型と継承の分離」があるのはご存知ですよね?
通常のクラスでは、型と実装の定義をともに含んでいますが、Javaのinterfaceは
型のみを明示的に分離し、また型のみの継承階層を作ることができます。

そのintarfaceに実装の概念(privateやprotected)を入れる必要はないでしょう。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2003-07-22 19:12
[quote]
ukさんの書き込み (2003-07-22 19:08) より:
>OOPのメリットとして「型と継承の分離」があるのはご存知ですよね?

「型と実装の分離」の間違いです。すいません。

スキルアップ/キャリアアップ(JOB@IT)