Print Friendly, PDF & Email

インターフェースに関する問題です。

1.インターフェースの作成

次のアウトプットとソースコードに整合するようにインターフェース、IPhone,IBrouser,ICamera,IMusicPlayerを作りなさい。

SmartPhoneクラスは各々のインターフェースの抽象メソッドをオーバーライドしているものとします。

<アウトプット>

音楽を再生する
Webを見る
電話を受ける
電話をかける
写真を撮影する
写真を表示する

<ソースコード>

package p13;

class SmartPhone implements IPhone, IBrouser, ICamera, IMusicPlayer {

    public void brouseWeb() {
        System.out.println("Webを見る");
    }

    public void showPictures() {
        System.out.println("写真を表示する");
    }

    public void takePicture() {
        System.out.println("写真を撮影する");
    }

    public void callPhone() {
        System.out.println("電話をかける");
    }

    public void recievePhone() {
        System.out.println("電話を受ける");
    }

    public void playMusic() {
        System.out.println("音楽を再生する");
    }
}

public class Q01 {

    public static void main(String[] args) {
        SmartPhone sp = new SmartPhone();
        sp.playMusic();
        sp.brouseWeb();
        sp.recievePhone();
        sp.callPhone();
        sp.takePicture();
        sp.showPictures();
    }
}

 

2.オリジナルクラスの作成

IPhoneをimplementsしたMyPhoneクラス、

IBrouserをimplementsしたMyBrouserクラス、

ICameraをimplementsしたMyCameraクラス、

IMusicPlayerをimplementsしたMyMusicPlayerクラスをそれぞれ作りなさい

 

3.Comparableインターフェースの実装

以下のクラスを作成しなさい。

スーパークラス abstract Figure

役割:図形を表現する抽象クラス。 java.lang.Comparableインターフェースを実装する。

フィールド
フィールド名 アクセス修飾子 役割
area protected double 図形の面積を保持する(面積は少数第2位四捨五入1位表示)
メソッド
メソッド名 アクセス修飾子 戻り値の型 役割
compareTo(Object o) public int Comparableインターフェースの同名メソッドの実装(オーバーライド)

 

サブクラス1 Rectangle extends Figure

役割:図形の一種である四角形を表現する。

フィールド
フィールド名 アクセス修飾子 役割
x private double 四角形の横幅を保持する
y private double 四角形の縦幅を保持する
コンストラクタ

役割:全てのフィールドを適切に初期化する

メソッド
メソッド名 アクセス修飾子 戻り値の型 役割
toString() public String Rectangle{area=xx.x}という文字列表現を返す。(オーバーライド)

 

サブクラス2 Circle extends Figure

役割:図形の一種である円を表現する。

フィールド
フィールド名 アクセス修飾子 役割
r private double 円の半径を保持する
コンストラクタ

役割:全てのフィールドを適切に初期化する

メソッド
メソッド名 アクセス修飾子 戻り値の型 役割
toString() public String Circle{area=xx.x}という文字列表現を返す。(オーバーライド)

 

<テストクラスの例>

package p13;

public class Q03 {

    public static void main(String[] args) {
        Figure[] fg = new Figure[2];
        fg[0] = new Rectangle(7.0, 10.0);
        fg[1] = new Circle(5.0);
        if (fg[0].compareTo(fg[1]) > 0) {
            System.out.println(fg[0] + "のほうが" + fg[1] + "より大きいです。");
        } else if (fg[0].compareTo(fg[1]) == 0) {
            System.out.println("同じ大きさです。");
        } else {
            System.out.println(fg[1] + "のほうが" + fg[0] + "より大きいです。");
        }
    }
}

<結果の例>

Circle{area=78.5}のほうがRectangle{area=70.0}より大きいです。

 

4.移譲を使って依存性を無くす

MyOs version2を搭載したMyPad、MyMac、MyPhoneがある。(以下、各機器と略す)

各機器のクラスは以下の通りである。

package p13;

class MyOsV2{

    public void startMyOs() {
        System.out.println("MyOs version2を起動します。");
    }
}

class MyPad {

    MyOsV2 os = new MyOsV2();

    public void doAsMyPad() {
        os.startMyOs();
        System.out.println("MyPad特有の機能を実行.");
    }
}

class MyMac {

    MyOsV2 os = new MyOsV2();

    public void doAsMyMac() {
        os.startMyOs();
        System.out.println("MyMac特有の機能を実行..");
    }
}

class MyPhone {

    MyOsV2 os = new MyOsV2();

    public void doAsMyPhone() {
        os.startMyOs();
        System.out.println("MyPhone特有の機能を実行...");
    }
}

以下は、上記クラスのテストクラスである。

package p13;

public class Q04 {

    public static void main(String[] args) {

        new MyPad().doAsMyPad();
        new MyMac().doAsMyMac();
        new MyPhone().doAsMyPhone();
    }
}

このとき、OSをバージョンアップして以下のMyOsV3にしたい。

package p13;

class MyOsV3{

    public void startMyOs() {
        System.out.println("MyOs version3を起動します。");
    }
}

しかし、今のままでは、OSと各機器が密結合してしまっており、OSを替えるにはそれぞれの機器のコードを修正する必要がある。

そこで、以下のクラス図を参考に、依存性を無くしてほしい。

つまり、OSのバージョンが3,4,5と上がったとしても各機器のクラスを変更する必要がないようにしてほしいのである。

移譲を使って依存性を無くす

<Q04のソースコード>

package p13;

public class Q04Answer {

    public static void main(String[] args) {

        new MyPad(new MyOsV2()).doAsMyPad();
        new MyMac(new MyOsV2()).doAsMyMac();
        new MyPhone(new MyOsV2()).doAsMyPhone();

        System.out.println("");

        new MyPad(new MyOsV3()).doAsMyPad();
        new MyMac(new MyOsV3()).doAsMyMac();
        new MyPhone(new MyOsV3()).doAsMyPhone();

    }
}

<結果>

MyOs version2を起動します。
MyPad特有の機能を実行.
MyOs version2を起動します。
MyMac特有の機能を実行..
MyOs version2を起動します。
MyPhone特有の機能を実行...

MyOs version3を起動します。
MyPad特有の機能を実行.
MyOs version3を起動します。
MyMac特有の機能を実行..
MyOs version3を起動します。
MyPhone特有の機能を実行...

5.オリジナルインターフェースの作成

あなたの理想の機能を抽象メソッドとして持つインターフェース達を作成しなさい。

インターフェース名は自由とします。

あなたの理想のインターフェース達をimplementsした理想のクラスを作成しなさい。

 

JavaSEの問題集トップページに戻る