- PR -

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

投稿者投稿内容
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2003-08-25 21:19
私も以前は、何でinterfaceはprotectedなメソッドを宣言できないのだろうかと思い悩んだことがあります。

しかし、今は、骨格実装抽象クラスの存在を知り、protectedなメソッドは骨格実装抽象クラスで定義(宣言)すれば良く、interfaceには必要ないと思っています。

protectedなアクセス制限は、カスタマイズ可能な内部仕様(実装の詳細)であり、
抽象クラスに定義することは、理にかなっていると考えています。

尚、骨格実装抽象クラスについての詳細は、Effective Javaに書かれています

[ メッセージ編集済み 編集者: かずくん 編集日時 2003-08-25 21:33 ]
Astmild
常連さん
会議室デビュー日: 2003/06/09
投稿数: 30
お住まい・勤務地: 大田区
投稿日時: 2003-08-25 23:07
もし Java の class が多重継承を認めていたとしも、interface は存在し、
protected には出来ないようになっていたのではないでしょうか。

なぜなら、インターフェースの目的はアーキテクチャの実装とインプリメン
テーションの実装を分離することにあるからです。

Java の interface はアーキテクチャの実装を担っているのですから、
private や protected などのインプリメンテーションを干渉する
アクセス修飾子を使用するのは、本来の目的から外れてしまいます。
そのため、public しか使えないのだと思います。


#用語の使い方が間違っていたらすみません。下記の意味で使いました。
#アーキテクチャ・・・どんな構造かを語るもの
#インプリメンテーション・・・どのように実現するかを語るもの
Jun
大ベテラン
会議室デビュー日: 2003/08/25
投稿数: 141
投稿日時: 2003-08-26 08:42
私はインターフェースがpublicなものしか持てないということがあまり理由の無いことだ
と思っています.
その理由として

1.インターフェースでprotectedなメソッドを持たずに骨格抽象クラス(実はeffective java
は読んだことがありませんのでその内容は知らないのですが, 少なくともインターフェース
ではないと想像します)で実装したとしても多重継承はできない.
従ってprotected なメソッドを持つinterfaceの代用にはならない.
2.インターフェースはネストしたクラスをもてます.(static な内部のクラス)
インターフェース内のネストしたクラスはなぜかpublic でなければならず,また
ネストしたクラス内では普通にprivateやprotectedな属性のメンバを持てる.
にもかかわらずネストしたクラスから参照するインターフェースのstatic final な
データ属性はそれがインターフェース外に対して隠蔽されるべきものであっても
publicにしなければならない.
これはインターフェースのメンバをpublicに限定する理由の正当性を著しく疑わせる
ものです

簡単な言語というものは直交性に富んでおり, その場合によって異なる理由付けが必要に
なるようなものであるべきでないと考えますが, いかがでしょう
むしろこのような(interfaceのメンバ属性をpublicに限定するというような)制限
はコンパイラは簡単にしても言語としては複雑になるだけで利益が無いように思うの
ですが

お犬様
ベテラン
会議室デビュー日: 2003/01/26
投稿数: 67
投稿日時: 2003-08-26 09:48
引用:
Junさんの書き込み (2003-08-26 08:42) より:

従ってprotected なメソッドを持つinterfaceの代用にはならない.

インターフェースのstatic final なデータ属性はそれがインターフェース外に対して隠蔽されるべきものであっても public にしなければならない. これはインターフェースのメンバをpublicに限定する理由の正当性を著しく疑わせる
ものです

私はインターフェースがpublicなものしか持てないということがあまり理由の無いことだと思っています.

ところで、隠蔽されるべきものが なぜ interface で定義されなければならないのでしょうか? 前にも同じ事を書きましたが、interface はその interface を実装/拡張する class/interface のためのものでなく、その interface を利用する class のためのものであると思われます。そのため interface を実装/拡張する class/interface で便利に使おうとすると無理が出るのだと思われます。ご不満がおありでしたら JavaCC を使用するなりしてプリプロセッサを お作りになる事をお勧めします。
ほむら
ぬし
会議室デビュー日: 2003/02/28
投稿数: 583
お住まい・勤務地: 東京都
投稿日時: 2003-08-26 11:32
ども、ほむらです。
質問を混ぜ返すようで申し訳ないのですが。。。
-----------
そもそも、implementsって継承に含まれるのでしょうか?
私的な解釈だとクラスの場合、extendsは拡張という
名前のとおり継承という動作であると思います。

でも、インターフェイスの場合 implements 実装(?)という
名前からでは継承という動作とどうも一致しません^^;;;;;
あくまで実装の付加という意味合いが強いのではないかなと。。。。
つまり、継承しているというよりもクラス内部で別途宣言している感じですか。。。
(もう少し親密ですけど^^;;;;)

こう考えた場合、インターフェイスとの継承関係は存在しなくなってしまうので
インターフェイス側でprotectedの宣言をしてもimplementsで追加したクラス側には
アクセス権限もってないんじゃないかなとおもうのですが考えすぎてしょうか?
わらび
ベテラン
会議室デビュー日: 2002/08/30
投稿数: 53
投稿日時: 2003-08-26 15:26
でも、public以外のinterfaceのメソッドを許すと、interfaceを
使用する旨みが半減してしまうように思うのですが、、、

interface A 型の変数のBメソッドを、利用する側は、必ず使えるとは
限らなくなってしまうんですよね?

そうなると、interfaceを使用して、実装によらず、アクセス手段を
公開する、interfaceの働きが保証できなくなってしまうのではないでしょうか?
ほむら
ぬし
会議室デビュー日: 2003/02/28
投稿数: 583
お住まい・勤務地: 東京都
投稿日時: 2003-08-26 17:32
ども、ほむらです。
先ほどは書き忘れましたが僕もinterfaceにはpublicのみで十分と思っています。
Jun氏の意見とは正反対になってしまうのでちと心苦しくも思いますが
public以外である理由もまたないかなと。。。
----------------
さてさて、毎度の事ながら僕の発言は横道にそれがちですが
後学のためにということでご容赦><
(独り言とも言うかも(笑

JAVAを勉強し始めてまだまだ時間も短いですが
僕の認識としてもclassとinterfaceはまったく別のものだと思っています。
宣言の過程においては類似点が多いのかとも思いますけれども
interfaceは’ある機能を提供するための機能セットの定義’と認識しているので
隠蔽はおろか実装も不可能なのではないかと思います。

# ちなみに、interfaceを英和で引くと共有領域という意味があるみたいです

なぜなら、機能としての操作を隠蔽するのであれば
それは機能を取り込んだ先のオブジェクトで実装すればよいということであると思うし。
実装についても機能について固定的な操作しかできないのであれば
それはやはり、機能セットとしてでなく取り込んだ先のオブジェクトで
実装すべきではないかなと、、、、

ん〜上手に表現できないところが残念なのですが
classで定義するのが何をするのか に対して
interfaceで定義するのは何をさせるかのか(機能としての必要項目??)
だと思います。
(abstract classならば何をして拡張後に何をさせるのかとか?)

# 多重継承ってそんなにメリットのあるものなのですか?
# C++で作っていた時代はメンバ変数に取り込んで
# アクセス用のラッパーを作るだけで一度も使用したことがないのですが・・・・・
酒樽
会議室デビュー日: 2002/06/06
投稿数: 10
投稿日時: 2003-08-26 17:32
まず、意見を整理していいですか?
protected希望派の意見は「仕組みとして」付けようと思えば付けられるのでは?という
立場ですが、否定派は「意味合いの上で」やられては矛盾が生じるという主張です。
そもそも着眼点が違うので、互いの意見がかみ合っていないのも道理です。

で、私は否定派です。
Javaにもオブジェクト指向に準拠していない、実装上の妥協部分があるわけですが、
それを例にとってinterfaceの根本的な役割も曲げてしまうというのは、
少々乱暴だと思います。
この場合、場当たり的にinterfaceにprotectedを追加するのではなく、
骨格抽象クラスを多重継承できるように改善されるべきだと考えます。

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