Java - インターフェース


■ページ目次

Top

■インタフェース

■割引インターフェースの作成
  1. 割引インターフェース"DiscountInterface.java"を作ります。
    1. // 1102
    2. // 割引インターフェースです。
    3. // 割引される商品情報が持っていなければならないメソッドの
    4. // 実装を強制しています。
    5. interface DiscountInterface {
    6. // 商品割引率の値を設定します。
    7. void setDiscount(int discount);
    8. // 商品割引率の値を取得します。
    9. int getDiscount();
    10. }
  2. 上記インターフェース"DiscountInterface.java"を実装して"DiscountProduct.java"を作ります。
    1. // 1102
    2. // 割引商品クラスです。
    3. // ひとつの商品に対するフィールドやフィールドを操作するためのメソッドを
    4. // 提供しています。
    5. public class DiscountProduct extends Product implements DiscountInterface {
    6. private int discount; // 商品割引率
    7. // 割引商品クラスのコンストラクター。
    8. DiscountProduct(String code, String name, int price) {
    9. this(code, name, price, 0);
    10. }
    11. // 割引商品クラスのコンストラクター。
    12. DiscountProduct(String code, String name, String price) {
    13. this(code, name, price, "0");
    14. }
    15. // 割引商品クラスのコンストラクター。
    16. DiscountProduct(String code, String name, int price, int discount) {
    17. super(code, name, price);
    18. setDiscount(discount);
    19. }
    20. // 割引商品クラスのコンストラクター。
    21. DiscountProduct(String code, String name, String price, String discount) {
    22. super(code, name, price);
    23. setDiscount(discount);
    24. }
    25. // 商品割引率に値を設定します。
    26. public void setDiscount(int discount) {
    27. if (discount < 0 || discount > 100) {
    28. this.discount = 0;
    29. return;
    30. }
    31. this.discount = discount;
    32. }
    33. // 商品割引率に値を設定します。
    34. public void setDiscount(String discount) {
    35. setDiscount(Integer.parseInt(discount));
    36. }
    37. // 商品割引率の値を取得します。
    38. public int getDiscount() {
    39. return this.discount;
    40. }
    41. // 商品の売値の値を取得します。
    42. public int getPrice() {
    43. return (int)(super.getPrice() * (1 - discount / 100.0));
    44. }
    45. }
  3. 同様に、上記インターフェース"DiscountInterface.java"を実装して"SetProduct.java"を作ります。
    1. // 1102
    2. // セット商品クラスです。
    3. // ひとつまたは複数の商品を集めて、割引したものをセット商品として扱います。
    4. // セット商品に対するフィールドやフィールドを操作するためのメソッドを
    5. // 提供しています。
    6. public class SetProduct extends AbstractProduct implements DiscountInterface {
    7. private int discount; // セット商品割引率
    8. private AbstractProduct[] products; // セット商品リスト
    9. // セット商品クラスのコンストラクター。
    10. SetProduct(String code, String name, int discount, AbstractProduct[] products) {
    11. setCode(code);
    12. setName(name);
    13. setDiscount(discount);
    14. setProducts(products);
    15. }
    16. // 商品の売値の値を取得します。
    17. public int getPrice() {
    18. int price = 0;
    19. for (int i = 0; i < products.length; i++) {
    20. price += products[i].getPrice();
    21. }
    22. return (int)(price * (1 - discount / 100.0));
    23. }
    24. // 商品割引率に値を設定します。
    25. public void setDiscount(int discount) {
    26. if (discount < 10 || discount > 100) {
    27. this.discount = 0;
    28. return;
    29. }
    30. this.discount = discount;
    31. }
    32. // 商品割引率に値を設定します。
    33. public void setDiscount(String discount) {
    34. setDiscount(Integer.parseInt(discount));
    35. }
    36. // 商品割引率の値を取得します。
    37. public int getDiscount() {
    38. return discount;
    39. }
    40. // 商品割引率に値を設定します。
    41. public void setProducts(AbstractProduct[] products) {
    42. this.products = products;
    43. }
    44. }
  4. つぎの"TestProduct.java"を作成し、実行してください。
    1. // 1102
    2. // 商品クラスをテストするクラスです。
    3. public class TestProduct {
    4. public static void main(String[] args) {
    5. AbstractProduct[] p = new AbstractProduct[4];
    6. p[0] = new DiscountProduct("A001", "パソコン", 188000, 20);
    7. p[1] = new Product("P001", "プリンター", 24000);
    8. p[2] = new DiscountProduct("C001", "CD-ROM", 6500, 10);
    9. p[3] = new Product("M001", "USBメモリー", 9800);
    10. System.out.println("商品配列のインスタンスを生成しました。 p = " + p);
    11. for (int i = 0; i < p.length; i++) {
    12. System.out.println("商品のインスタンスを生成しました。 p[" + i + "] = " + p[i]);
    13. System.out.println(" code = " + p[i].getCode());
    14. System.out.println(" name = " + p[i].getName());
    15. System.out.println(" price = " + p[i].getPrice());
    16. }
    17. SetProduct s = new SetProduct("SA01", "パソコン・セット", 10, p);
    18. System.out.println("セット商品のインスタンスを生成しました。 s = " + s);
    19. System.out.println(" code = " + s.getCode());
    20. System.out.println(" name = " + s.getName());
    21. System.out.println(" price = " + s.getPrice());
    22. }
    23. }

    □ 実行結果

    $ java TestProduct
    商品配列のインスタンスを生成しました。 p = [LProductInterface;@1e63e3d
    商品のインスタンスを生成しました。 p[0] = DiscountProduct@1004901
       code = A001
       name = パソコン
      price = 150400
    商品のインスタンスを生成しました。 p[1] = Product@1b90b39
       code = P001
       name = プリンター
      price = 24000
    商品のインスタンスを生成しました。 p[2] = DiscountProduct@18fe7c3
       code = C001
       name = CD-ROM
      price = 5850
    商品のインスタンスを生成しました。 p[3] = Product@b8df17
       code = M001
       name = USBメモリー
      price = 9800
    セット商品のインスタンスを生成しました。 s = SetProduct@1172e08
       code = SA01
       name = パソコン・セット
      price = 171045
    
Top
■実習

  1. 図形クラス"Zukei.java"をインターフェース"Zukei.java"にしてください。また、いままでの図形クラス"Zukei.java"は、抽象図形クラス"AbstractZukei.java"にします。

    図形クラス階層
    図 図形クラス階層

    インターフェースが実装するのは、以下のメソッドです。

    上記インターフェースを利用して、図形を描画するクラスを作成してください。
  2. "Maru.java"
  3. Maru(int x, int y, int r) 中心(x, y)と半径r
  4. "Sankaku.java"
  5. Sankaku(int[][] p) 頂点の座標(x0, y0),(x1, y1), (x2, y2)の組
  6. "Shikaku.java"
  7. Shikaku(int x0, int y0, int x1, int y1) 左上の座標(x0, y0)と右下の座標(x1, y1)

    "AbstractZukei.java"

    "ZukeiTest01.java"は、変更ありません。

    "Sankaku.java"

    1. public class Sankaku extends AbstractZukei {
    2. private int[][] p;
    3. private double[] l = new double[3]; // 辺の長さ
    4. Sankaku(int[][] p) {
    5. this("三角形", p);
    6. }
    7. Sankaku(String name, int[][] p) {
    8. setName(name);
    9. this.p = p;
    10. for (int i = 0; i < l.length; i++) {
    11. l[i] = distance(p[i], p[(i + 1) % l.length]);
    12. }
    13. }
    14. public double length() {
    15. return distance(p[0], p[1]) + distance(p[1], p[2]) + distance(p[2], p[0]);
    16. }
    17. private double distance(int[] x, int[] y) {
    18. return Math.sqrt(diff(x[0], y[0]) * diff(x[0], y[0]) + diff(x[1], y[1]) * diff(x[1], y[1]));
    19. }
    20. private double diff(int x, int y) {
    21. return Math.abs(y - x);
    22. }
    23. }

    □ 実行結果

    $ java ZukeiTest01
    基準四角 の周の長さ = 400
    基準三角 の周の長さ = 341
    基準丸 の周の長さ = 628
    三角形 の周の長さ = 752
    丸 の周の長さ = 377
    四角形 の周の長さ = 480
    
    


inserted by FC2 system