- PR -

クラスの継承、インターフェースの実装の関係がこれで良いのか分かりません・・

1
投稿者投稿内容
さるば
会議室デビュー日: 2005/02/03
投稿数: 16
投稿日時: 2006-01-17 11:58
下記のような5つのクラスがあるのですが、
クラスの継承、インターフェースの実装の関係がこれで良いのか分かりません。
Superクラスは多重継承になっていないのでしょうか?

public interface Interface extends java.何かのインターフェース{
   public void printValue();
}

public abstract class Super implements Interface{

}

public class Sub1 extends Super{

    /* (非 Javadoc)
     * @see Interface#printValue()
     */
    public void printValue() {
    // TODO 自動生成されたメソッド・スタブ
        System.out.println(getClass().getName());
    }

}

public class Sub2 extends Super implements Interface{

    /* (非 Javadoc)
     * @see Interface#printValue()
     */
    public void printValue() {
     // TODO 自動生成されたメソッド・スタブ
        System.out.println(getClass().getName());
    }

}

public class Main {

    public static void main(String[] args) {

       Super[] classes = new Super[2];
       classes[0] = new Sub1();
       classes[1] = new Sub2();

       for(int i=0; i<classes.length; i++){
           classes[i].printValue();
       }
    }
}

びしばし
大ベテラン
会議室デビュー日: 2002/03/13
投稿数: 181
投稿日時: 2006-01-17 12:40
引用:

さるばさんの書き込み (2006-01-17 11:58) より:
下記のような5つのクラスがあるのですが、
クラスの継承、インターフェースの実装の関係がこれで良いのか分かりません。
Superクラスは多重継承になっていないのでしょうか?


関係が良いか悪いかは何をもって「良い」というのかわかりませんが、これはこれでアリですよ。多重継承にもなっていません。

Super implements Interface なのに Sub2 extends Super implements Interface なのも、冗長ですが「悪」ではありません。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2006-01-17 12:48
これは、全然ありですね。
インターフェイスは直接でない限り、
何回でも同じものが実装できますし、好きなだけ実装できます。

Class#getInterfaces()を実行したときに、
直接実装したものしか返さないため、

Sub.class.getInterfaces();
Sub2.class.getInterfaces();

では、戻り値が違います。

クラスのインターフェイスを取得するフレームワークがあるとして、
そのフレームワークが上記の様な取得を行っている場合、
インターフェイスを適切に渡すために、Sub2のような実装を行うケースもありえます。
さるば
会議室デビュー日: 2005/02/03
投稿数: 16
投稿日時: 2006-01-17 13:36
びしばしさん、かつのりさん早速のご回答ありがとうございました。
お二人とも「全然あり」とのご回答で安心しました。

Javaとは・・のような本やサイトにはこのような例が載っておらず、
近くに相談できる人もいないので本当に助かりました。

みなさん、このような少し応用というか実践(?)のようなプログラムの
書き方ってどうやって習得するのでしょうか?

もしよかったら、教えてください。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2006-01-17 20:40
仕事でもオープンソースのプロダクトを頻繁に使用しますが、

・メソッドの仕様を知りたいとき
・不可解なバグやエラーが発生したとき
・フレームワークを拡張したいとき

など、様々なケースでコードを読むようにしています。
オープンソースのコードは、比較的勉強になりますよ。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2006-01-17 21:16
直接の回答ではないですが、以前、私が質問した、
「java.util.Collection のメソッドがサブインターフェースの List にもあるのはなぜ?」
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=7753&forum=12
の (2) と似たような疑問だと思いました。ご参考までに。
さるば
会議室デビュー日: 2005/02/03
投稿数: 16
投稿日時: 2006-01-18 17:02
かつのりさん、unibonさんご回答ありがとうございました。

かつのりさん>
 そういえば、前にjavaのソースを読んで勉強していた時期がありました。
 やっぱり人のコードを読んで、形を真似するみたいなのが一番なんですかね。
 また何かターゲットを見つけて、コードを読んでみようと思います。
 2度もご回答いただき、ありがとうございました。

unibonさん>
 リンク先拝見しました。
 私の質問したケースと似ているような・・・んー。
 でも、javaがやっているならなおさらOKのような妙な自信がでてきました(笑)
 ありがとうございます。
1

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