質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

継承

継承(インヘリタンス)はオブジェクト指向プログラミングに存在するシステムです。継承はオブジェクトが各自定義する必要をなくし、継承元のオブジェクトで定義されている内容を引き継ぎます。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Q&A

解決済

2回答

1898閲覧

多態性(ポリモーフィズム)についての対応箇所を教えてください。

yasukillyou

総合スコア9

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

継承

継承(インヘリタンス)はオブジェクト指向プログラミングに存在するシステムです。継承はオブジェクトが各自定義する必要をなくし、継承元のオブジェクトで定義されている内容を引き継ぎます。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

0グッド

2クリップ

投稿2021/06/30 13:09

編集2021/06/30 16:07

以下のソースコードにてメインメソッドにて各メンバーやメソッドを
呼び出している状態です。

以下の実行結果を得るmain()メソッドを作成して各図形描画インスタンスは、キーボードより入力された値を用いて生成するものとする。 【実行結果】プログラムを実行したら、どの図形の情報を表示させるか番号をキーボードから入力させます 図形描画[ 0:円 2:線 3:三角形 4:長方形 44:正方形 ] : >0 [円を描画] 中心点(100,100)から半径20 周囲の長さは、125.66370614359172 図形描画[ 0:円 2:線 3:三角形 4:長方形 44:正方形 ] : >2 [線を描画] 始点(0,0)から終点(100,100)まで 周囲の長さは、141.4213562373095 図形描画[ 0:円 2:線 3:三角形 4:長方形 44:正方形 ] : >3 [三角形を描画] 点1(0,0)から点2(100,100)、点3(0,200)の三角形 周囲の長さは、482.842712474619 内角の和は、180 図形描画[ 0:円 2:線 3:三角形 4:長方形 44:正方形 ] : >4 [四角形(矩形)を描画] 点(0,0)を基準として幅100,高さ50の四角形 周囲の長さは、300.0 内角の和は、360 図形描画[ 0:円 2:線 3:三角形 4:長方形 44:正方形 ] : >44 [正方形を描画] 点(0,0)を基準として幅・高さ200の正方形 周囲の長さは、800.0 内角の和は、360
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner s = new Scanner(System.in); System.out.println("図形描画[ 0:円 2:線 3:三角形 4:長方形 44:正方形 ] :"); int input = s.nextInt(); if (input == 0) { Figure a = new Circle(100, 100, 20); a.draw(); System.out.println("周囲の長さは、" + a.getPerimeter()); } else if (input == 2) { Figure b = new Line(0, 0, 100, 100); b.draw(); System.out.println("周囲の長さは、" + b.getPerimeter()); } else if (input == 3) { Polygon c = new Triangle(0, 0, 100, 100, 0, 200); c.draw(); System.out.println("周囲の長さは、" + c.getPerimeter()); System.out.println("内角の和は、" + c.getInternalAngle()); } else if (input == 4) { Polygon d = new Rectangle(0, 0, 100, 50); d.draw(); System.out.println("周囲の長さは" + d.getPerimeter()); System.out.println("内角の和は、" + d.getInternalAngle()); } else if (input == 44) { Polygon e = new Square(0, 0, 200); e.draw(); System.out.println("周囲の長さは" + e.getPerimeter()); System.out.println("内角の和は、" + e.getInternalAngle()); } else { } s.close(); } }

※初学者です
mainメソッドにて、
a.draw();
a.getPerimeter());
この2つのメソッドに対して一度に呼びだす
書き方が思いつかないです方法を教えてください。
なお、継承関係は以下に記載します。

interface Figure { void draw(); double getPerimeter(); }
public class Line implements Figure { private Point p1; private Point p2; public Line() { this(0, 0, 0, 0); } public Line(int x1, int y1, int x2, int y2) { this.p1 = new Point(x1, y1); this.p2 = new Point(x2, y2); } public void draw() { System.out.println("[線を描画]始点" + this.p1.getX() + "," + this.p1.getY() + "から終点" + this.p2.getX() + "," + this.p2.getY() + "まで"); } public double getPerimeter() { double dx = Math.pow(this.p2.getX() - this.p1.getX(), 2); double dy = Math.pow(this.p2.getY() - this.p1.getY(), 2); return Math.sqrt(dx + dy); } }
public abstract class Shape implements Figure { public abstract void draw(); public abstract double getPerimeter(); }
public class Line implements Figure { private Point p1; private Point p2; public Line() { this(0, 0, 0, 0); } public Line(int x1, int y1, int x2, int y2) { this.p1 = new Point(x1, y1); this.p2 = new Point(x2, y2); } public void draw() { System.out.println("[線を描画]始点" + this.p1.getX() + "," + this.p1.getY() + "から終点" + this.p2.getX() + "," + this.p2.getY() + "まで"); } public double getPerimeter() { double dx = Math.pow(this.p2.getX() - this.p1.getX(), 2); double dy = Math.pow(this.p2.getY() - this.p1.getY(), 2); return Math.sqrt(dx + dy); } }
public class Circle extends Shape { private Point center; private int radius; public Circle() { this(0, 0, 0); } public Circle(int x, int y, int r) { this.center = new Point(x, y); this.radius = r; } public void draw() { System.out.println("[円を描画]中心点" + this.center.getX() + "," + this.center.getY() + "から半径" + this.radius); } public double getPerimeter() { return this.radius * 2 * Math.PI; } }
public abstract class Polygon extends Shape { protected int angle; public int getInternalAngle() { return (this.angle - 2) * 180; } }
public class Triangle extends Polygon { Point p1; Point p2; Point p3; public Triangle(int x1, int y1, int x2, int y2, int x3, int y3) { this.p1 = new Point(x1, y1); this.p2 = new Point(x2, y2); this.p3 = new Point(x3, y3); super.angle = 3; } public void draw() { System.out.println("[三角形を描画] 点1(" + this.p1.getX() + "," + this.p1.getY() + ")から点2(" + this.p2.getX() + "," + this.p2.getY() + "),点3(" + this.p3.getX() + "," + this.p3.getY() + ")の三角形"); } public double getPerimeter() { double x21 = this.p2.getX() - this.p1.getX(); double y21 = this.p2.getY() - this.p1.getY(); double a = Math.sqrt(x21 * x21 + y21 * y21); double x32 = this.p3.getX() - this.p2.getX(); double y32 = this.p3.getY() - this.p2.getY(); double b = Math.sqrt(x32 * x32 + y32 * y32); double x13 = this.p1.getX() - this.p3.getX(); double y13 = this.p1.getY() - this.p3.getY(); double c = Math.sqrt(x13 * x13 + y13 * y13); return a + b + c; } }
public class Rectangle extends Polygon { protected Point p; protected int width; protected int height; public Rectangle(int x, int y, int width, int height) { this.p = new Point(x, y); this.width = width; this.height = height; super.angle = 4; } public void draw() { System.out.println("[長方形(矩形)を描画] 点" + this.p.getX() + "," + this.p.getY() + "を基準として幅" + this.width + "、高さ" + this.height + "の長方形"); } public double getPerimeter() { return (this.width + this.height) * 2; } }
public class Square extends Rectangle { public Square(int x, int y, int width) { super(x, y, width, width); } public void draw() { System.out.println("[正方形を描画] 点" + this.p.getX() + "," + this.p.getY() + "を基準として幅・高さ" + this.width + "の正方形"); } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

mainクラスにて、
draw();
getPerimeter();
上記のメソッドをまとめて呼び出す書き方が思いつかないのです、

なるほど。わたしならこうしますかね。

  1. 説明文を返すhogege()メソッドをFigureインタフェースに追加
  2. draw()メソッドには、吐き先を指定する引数を追加

# 何度もコピペするのが面倒なので、内部クラスとして定義しています。

java

1import java.awt.*; 2import java.io.PrintStream; 3import java.util.Scanner; 4 5// 6public class xxHogege { 7 // 8 interface Figure { 9 void draw(PrintStream ps); 10 11 double getPerimeter(); 12 13 String hogege(); 14 } 15 16 // 17 public static void main(String[] args) { 18 Scanner s = new Scanner(System.in); 19 System.out.println("図形描画[ 0:円 2:線 3:三角形 4:長方形 44:正方形 ] :"); 20 21 int input = s.nextInt(); 22 Figure figure = null; 23 24 if (input == 0) { 25 // figure = new Circle(100, 100, 20); 26 } else if (input == 2) { 27 figure = new Line(0, 0, 100, 100); 28 } else if (input == 3) { 29 figure = new Triangle(0, 0, 100, 100, 0, 200); 30 } else if (input == 4) { 31 // figure = new Rectangle(0, 0, 100, 50); 32 } else if (input == 44) { 33 // figure = new Square(0, 0, 200); 34 } else { 35 36 } 37 38 // 39 figure.draw(System.out); 40 System.out.println(figure.hogege()); 41 42 s.close(); 43 } 44 45 // inner classにしたので、staticをつけている。 46 public static class Line implements Figure { 47 48 private Point p1; 49 private Point p2; 50 51 public Line() { 52 this(0, 0, 0, 0); 53 } 54 55 public Line(int x1, int y1, int x2, int y2) { 56 this.p1 = new Point(x1, y1); 57 this.p2 = new Point(x2, y2); 58 } 59 60 @Override 61 public void draw(PrintStream ps) { 62 ps.println("[線を描画]始点" + this.p1.getX() + "," + this.p1.getY() + "から終点" + this.p2.getX() + "," 63 + this.p2.getY() + "まで"); 64 } 65 66 @Override 67 public double getPerimeter() { 68 double dx = Math.pow(this.p2.getX() - this.p1.getX(), 2); 69 double dy = Math.pow(this.p2.getY() - this.p1.getY(), 2); 70 return Math.sqrt(dx + dy); 71 } 72 73 @Override 74 public String hogege() { 75 return "周囲の長さは、" + getPerimeter(); 76 } 77 } 78 79 // 80 public static abstract class Shape implements Figure { 81 } 82 83 // 84 public static abstract class Polygon extends Shape { 85 protected int angle; 86 87 public int getInternalAngle() { 88 return (this.angle - 2) * 180; 89 } 90 } 91 92 // 93 public static class Triangle extends Polygon { 94 95 Point p1; 96 Point p2; 97 Point p3; 98 99 public Triangle(int x1, int y1, int x2, int y2, int x3, int y3) { 100 this.p1 = new Point(x1, y1); 101 this.p2 = new Point(x2, y2); 102 this.p3 = new Point(x3, y3); 103 super.angle = 3; 104 } 105 106 @Override 107 public void draw(PrintStream ps) { 108 ps.println("[三角形を描画] 点1(" + this.p1.getX() + "," + this.p1.getY() + ")から点2(" + this.p2.getX() + "," 109 + this.p2.getY() + "),点3(" + this.p3.getX() + "," + this.p3.getY() + ")の三角形"); 110 } 111 112 @Override 113 public double getPerimeter() { 114 115 double x21 = this.p2.getX() - this.p1.getX(); 116 double y21 = this.p2.getY() - this.p1.getY(); 117 double a = Math.sqrt(x21 * x21 + y21 * y21); 118 119 double x32 = this.p3.getX() - this.p2.getX(); 120 double y32 = this.p3.getY() - this.p2.getY(); 121 double b = Math.sqrt(x32 * x32 + y32 * y32); 122 123 double x13 = this.p1.getX() - this.p3.getX(); 124 double y13 = this.p1.getY() - this.p3.getY(); 125 double c = Math.sqrt(x13 * x13 + y13 * y13); 126 return a + b + c; 127 } 128 129 @Override 130 public String hogege() { 131 return 132 "周囲の長さは" + getPerimeter() + "\n" + 133 "内角の和は、" + getInternalAngle(); 134 } 135 } 136} 137

投稿2021/06/30 21:52

shiketa

総合スコア3990

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

この2つのメソッドに対して
省略する書き方が思いつかないです方法を教えてください。

「省略する書き方」とは「そのインタフェースを実装するクラスで、そのメソッドの実装を省略する」ということと解釈します。

そのインタフェースに、デフォルト実装を定義する。

java

1import java.awt.*; 2 3public class xxHogege { 4 // 5 interface Figure { 6 7 default void draw() { 8 throw new RuntimeException("Not implement."); 9 } 10 11 default double getPerimeter() { 12 throw new RuntimeException("Not implement."); 13 } 14 } 15 16 // 17 public class Line implements Figure { 18 19 private Point p1; 20 private Point p2; 21 22 public Line() { 23 this(0, 0, 0, 0); 24 } 25 26 public Line(int x1, int y1, int x2, int y2) { 27 this.p1 = new Point(x1, y1); 28 this.p2 = new Point(x2, y2); 29 } 30 31// @Override 32// public void draw() { 33// System.out.println("[線を描画]始点" + this.p1.getX() + "," + this.p1.getY() + "から終点" + this.p2.getX() + "," 34// + this.p2.getY() + "まで"); 35// } 36// 37// @Override 38// public double getPerimeter() { 39// double dx = Math.pow(this.p2.getX() - this.p1.getX(), 2); 40// double dy = Math.pow(this.p2.getY() - this.p1.getY(), 2); 41// return Math.sqrt(dx + dy); 42// } 43 } 44} 45

投稿2021/06/30 13:30

編集2021/06/30 13:36
shiketa

総合スコア3990

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yasukillyou

2021/06/30 13:55 編集

ご回答ありがとうございます。 確認したいことがあります これは、メインメソッドには書かないということでしょうか? 説明不足で申し訳ございません。 mainクラスにて、 draw(); getPerimeter(); 上記のメソッドをまとめて呼び出す書き方が思いつかないのです、 なお、処理としては以下のようにしたいのです。 以下の実行結果を得るmain()メソッドを作成して各図形描画インスタンスは、キーボードより入力された値を用いて生成するものとする。 【実行結果】プログラムを実行したら、どの図形の情報を表示させるか番号をキーボードから入力させます 図形描画[ 0:円 2:線 3:三角形 4:長方形 44:正方形 ] : >0 [円を描画] 中心点(100,100)から半径20 周囲の長さは、125.66370614359172 図形描画[ 0:円 2:線 3:三角形 4:長方形 44:正方形 ] : >2 [線を描画] 始点(0,0)から終点(100,100)まで 周囲の長さは、141.4213562373095 図形描画[ 0:円 2:線 3:三角形 4:長方形 44:正方形 ] : >3 [三角形を描画] 点1(0,0)から点2(100,100)、点3(0,200)の三角形 周囲の長さは、482.842712474619 内角の和は、180 図形描画[ 0:円 2:線 3:三角形 4:長方形 44:正方形 ] : >4 [四角形(矩形)を描画] 点(0,0)を基準として幅100,高さ50の四角形 周囲の長さは、300.0 内角の和は、360 図形描画[ 0:円 2:線 3:三角形 4:長方形 44:正方形 ] : >44 [正方形を描画] 点(0,0)を基準として幅・高さ200の正方形 周囲の長さは、800.0 内角の和は、360
Crimson_Tide

2021/06/30 14:59

必要な説明ですので、上記内容を質問文に加筆修正しましょう。 またもう少し具体的に記載する必要があるかと思います。 入力が図形を指定する0 ,2 3,4, 44だけのように見えますが、 現状mainで各描画に必要なパラメータをインスタンスの引数に直接与えています。 省略バージョンでは、図形に応じて入力させるのか、予め変数で定義しておくのか。 また具体的実装は無理でもmainメソッドのイメージを、文章かなんちゃってプログラムで記載すると回答も得やすいかと思います。 例えば int input = s.nextInt(); input によって必要なパラメータを入力させる inputとパラメータによってインスタンスを生成する drow(input , パラメータ); //inputとパラメータを引数で渡す・・ getPerimeter(); //inputとパラメータを引数で渡す・・ また希望する省略の条件も記述したほうがいいと思います 「単に行数が削減できればいいのか」 (私が思いつくのはこれですが)「パラメータによってインスタンスを生成、実行結果を得る別メソッドや別のクラスを新たに使ってもいいのか」 (実現可否はともかく)「別メソッドやクラスを使わず、現状のクラスの改造だけでinputとパラメータで実現したいのか」 などなど
yasukillyou

2021/06/30 16:00

ご指摘、ありがとうございます、質問文に加筆修正します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問