- PR -

class or interface ?

投稿者投稿内容
ocean
ベテラン
会議室デビュー日: 2003/07/06
投稿数: 65
投稿日時: 2003-09-02 12:21
私が言いたいのは、JPanelがImplementLikeThis1の実装クラスでなくなれば、代入がなりたたなくなるということです。本来外部に公開すべきでないインターフェースが公開されることで、このような問題が生じます。

引用:

つまり、あなたによるあなたのためのインターフェイスなのですね。
自分でインターフェイスを定義し、自分で実装クラスを作成する。
そして、インターフェイス型を他の人が参照することもない。

そういう目的ならば、package private(publicでない)インターフェイスと
実装クラスを定義することをお勧めします



激しく同意します。

[ メッセージ編集済み 編集者: ocean 編集日時 2003-09-02 12:25 ]
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2003-09-02 13:13
引用:

コンピュータはサブクラスでなく私の例で言うとプロトコルに相当しますが



プロトコルであればなおさら、has a 関係(is implemented in a 関係)であるオブジェクトコンポジションの方が妥当であると思われます。

ネットワークのプロトコルも、実装を切り替えても、問題ないのはそのような仕組みだからですよね(TCP -> UDPに切り替えるみたいに。その上位のプロトコル(何だっけ?)がトランスポート層のプロトコルを実装の詳細とするとなっているからこそ出来るんですよね)

# ネットワークについては、理解が不十分なので、適切なフォローをお願いします。
Jun
大ベテラン
会議室デビュー日: 2003/08/25
投稿数: 141
投稿日時: 2003-09-02 15:02
引用:

oceanさんの書き込み (2003-09-02 12:21) より:
私が言いたいのは、JPanelがImplementLikeThis1の実装クラスでなくなれば、代入がなりたたなくなるということです。本来外部に公開すべきでないインターフェースが公開されることで、このような問題が生じます。

引用:

つまり、あなたによるあなたのためのインターフェイスなのですね。
自分でインターフェイスを定義し、自分で実装クラスを作成する。
そして、インターフェイス型を他の人が参照することもない。

そういう目的ならば、package private(publicでない)インターフェイスと
実装クラスを定義することをお勧めします



激しく同意します。

[ メッセージ編集済み 編集者: ocean 編集日時 2003-09-02 12:25 ]


インターフェースは使用者には使わせたいがそのメソッドには使わせたくないものと
使わせたいものがあるということでしょう.
ただ開発の都合もありますから使わせたくないメソッドを仕様として定義したい
(ただし使うことはできない)ということをいっているのですが
yamasa
ベテラン
会議室デビュー日: 2003/02/15
投稿数: 80
投稿日時: 2003-09-02 15:31
引用:

Junさんの書き込み (2003-09-02 15:02) より:
インターフェースは使用者には使わせたいがそのメソッドには使わせたくないものと
使わせたいものがあるということでしょう.
ただ開発の都合もありますから使わせたくないメソッドを仕様として定義したい
(ただし使うことはできない)ということをいっているのですが


ですから、「使用者には使わせたくないメソッド」なんてものは
レイヤリングの観点からすれば全く別のレイヤにて定義すべきものであり、
カプセル化の原則に反していると言っているではないですか。

そもそも、2003-09-01 13:54 の私の発言に、
Junさんはどう答えます?
ぽん
大ベテラン
会議室デビュー日: 2003/05/13
投稿数: 157
投稿日時: 2003-09-02 16:14
Junさん、こんにちは。

yamasaさんの発言にプラスして、
Astmildさんの「2003-09-01 02:05」への意見も聞かせては頂けませんか?
(1)・(2)の「メリット」&「デメリット」&「根拠」がJunさんの考えと一致してますか?

[ メッセージ編集済み 編集者: ぽん 編集日時 2003-09-02 16:35 ]
cats
大ベテラン
会議室デビュー日: 2002/11/29
投稿数: 221
お住まい・勤務地: 東京
投稿日時: 2003-09-02 16:26
「abstract classにはprotectedが使えるのに、
interfaceでは何故publicしか使えないのか?」

言語設計者が、使用頻度と言語仕様の簡素さを天秤にかけたのではないでしょうか。

確かに、interfaceにprotectedを使用したいケースはあるかもしれません。
現状の仕様で行いたいのなら、abstract classを使えばいいでしょう。
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2003-09-02 16:50
自分の投稿より
引用:

プロトコルであればなおさら、has a 関係(is implemented in a 関係)であるオブジェクトコンポジションの方が妥当であると思われます。

ネットワークのプロトコルも、実装を切り替えても、問題ないのはそのような仕組みだからですよね(TCP -> UDPに切り替えるみたいに。その上位のプロトコル(何だっけ?)がトランスポート層のプロトコルを実装の詳細とするとなっているからこそ出来るんですよね)



プロトコルクラスとネットワークのプロトコルを混同しており、
的外れな、反論になってしまいました。
この内容は、無視してやってください。
Jun
大ベテラン
会議室デビュー日: 2003/08/25
投稿数: 141
投稿日時: 2003-09-03 10:03
引用:

かずくんさんの書き込み (2003-08-29 19:21) より:
引用:

interface同士の継承関係は現状のようにextendsをもちいるのでなく, すべてimplementsを用いるべきとおもいます.つまりextendsは実装を含む継承を表し, implementsは
仕様のみの継承を表すというように



interface A {}
interface B implements A {}
のようにすべきであるといっているのだと思うのですが、インターフェースBはインターフェースAを実装しているの?
むしろAの機能(責任)を拡張しているものであり、extendsを使用することに何ら問題はないと思いますが?

引用:

クラスのインターフェースをimplementsにより継承できるようにしてもらいたい
などというのもあります

たとえば

public class A{}

public class B implements A{}



これは、あらかじめAから抽象仕様を抽出しておくことで、解決できる問題なので、必要ないでしょう。

public class A implements IF_A {}
public class B implements IF_A {}

ってな感じで。



自分でソースをいじれるものならばもちろんそのように作るのがいいのでしょうが
既成のクラスを使う場合そのように設計されているとは限りません.
そのような場合にインターフェースだけ利用したいということがある
と思いました.

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