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

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

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

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

Q&A

解決済

2回答

4281閲覧

他クラスのメソッドを使う方法

omikuji

総合スコア60

Java

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

0グッド

0クリップ

投稿2016/08/19 14:18

編集2016/08/19 15:48

当方プログラミング初心者で修行中です。継承の勉強を生かしてオセロプログラムを作ってみようと思い、書いてみましたがイマイチどうかけばいいかわからなくなってしまった部分があるので質問させて頂きます。(継承なんか使わなくても楽にかけるかもしれませんが、練習なのでそこはご容赦下さい)

java

1 2public class BoardData { 3 4 final static int out = -1; 5 final static int noPiece = 0; 6 final static int black = 1; 7 final static int white = 2; 8 9 static int turn = black; 10 private int pieceData[][] = new int[10][10]; 11 12 BoardData(){ 13 InitialPieceDataSetting(); 14 } 15 16 public void InitialPieceDataSetting(){ 17 for(int i = 0; i < 10; i++){ 18 for(int j = 0; j < 10; j++){ 19 if(i == 0 || i == 9 || j == 0 || j == 9){ 20 this.pieceData[i][j] = out; 21 }else{ 22 this.pieceData[i][j] = noPiece; 23 } 24 } 25 } 26 27 this.pieceData[4][5] = black; 28 this.pieceData[5][4] = black; 29 this.pieceData[4][4] = white; 30 this.pieceData[5][5] = white; 31 } 32 33 public int searchPieceData(int x, int y){ 34 return this.pieceData[x][y]; 35 } 36 37 public void changePieceData(int x, int y, int color){ 38 this.pieceData[x][y] = color; 39 } 40 41} 42 43public class Board extends BoardData{ 44 45 public void outputBoardByChar(){ 46 47 for(int i = 0; i < 10; i++){ 48 for(int j = 0; j < 10; j++){ 49 if(searchPieceData(i, j) == out){ 50 if(j == 9){ 51 System.out.println("■"); 52 }else{ 53 System.out.print("■"); 54 } 55 }else if(searchPieceData(i, j) == noPiece){ 56 System.out.print("□"); 57 }else if(searchPieceData(i, j) == black){ 58 System.out.print("●"); 59 }else if(searchPieceData(i, j) == white){ 60 System.out.print("○"); 61 } 62 } 63 } 64 65 } 66 67} 68 69/* 70public class CPU { 71 72 Board b = new Board(); 73 74 public void CPUPutPiece(int x, int y){ 75 b.changePieceData(x, y, BoardData.turn); 76 } 77 78} 79*/ 80 81public class Main { 82 83 public static void main(String[] args) { 84 85 Board b = new Board(); 86 b.outputBoardByChar(); 87 88 } 89 90} 91 92

このコードのCPUクラスからBoardDataクラスのpieceData[][]の値をいじれるようになりたいのですが、どのようなコードにすればいいでしょうか?
自分の考えとしてはchangePieceDataのメソッドを利用すればいいのでは?と考えたのですが・・・。このメソッドを継承していない他のクラスから使うことは可能ですか?
何かコードをわかりやすくする上でアドバイス等あれば、加えてお願いします。

【追記】
すいません、質問がわかりづらかったと思います。
このコード内で、最初自分が書いたCPUクラスをコメントで残していますが、こうすればちゃんとプログラムが動作することはわかりました。
ただ、ほかのクラスのインスタンスをここで宣言して使うような感じで使っていいのかな?と疑問に思った次第です。

当然

java

1public class CPU { 2 3 public void CPUPutPiece(int x, int y){ 4 changePieceData(x, y, BoardData.turn); 5 } 6 7}

ではコンパイルエラー出ると思うので・・・

プログラミング初心者すぎて何いってるのかわからないかもしれませんがよろしくおねがいします><

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

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

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

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

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

guest

回答2

0

ベストアンサー

changePieceDataはpublicなので使えると思いますが、試して何か問題がありましたか?

気になったのは、BoardData.turn の部分ですね。

  • せっかくCPUはBoardのインスタンスを使っているのに、BoardDataクラスの存在まで知らないといけない。
  • turnはstaticだが、最初からやり直したい場合に、turnを初期状態に戻す方法をBoardDataやBoardは提供していない。

というところでしょうか。
turnをstaticにしない方法も考えられますが、一つずつ改善していけばよいかと思います。


質問の追記に気づいてませんでした。すいません。

つまり、changePieceDataを使えばいいことはなんとなくわかるけど、BoardData.turnを使う事に抵抗があるということですね。

まず、継承している(=BoardはBoardDataでもある)ので、BoardもBoardData.turnを使う事が出来ます。
( Board.turn も使え、それはBoardData.turnと同じものを参照しています。 )

もう一つは、turnはBoardやBoardDataは知っているので、現在のturnを渡すくらいなら受け取らなくても自分で見ればいいという事です。

この2つから、turnを受け取らないオーバーロード(引数の違う同じ名前のメソッド)か別メソッドを作って、3つ目の引数はBoard自身が処理するという手も考えられます。

Board.java

public void changePieceData(int x, int y){ changePieceData(x,y,Board.turn); // 続きの処理は引数3つの方にやらせる // changePieceData(x,y,BoardData.turn); // 同じこと }

CPU.java

// b.changePieceData(x, y, BoardData.turn); b.changePieceData(x, y);

他には、Boardが今のturnを教えてくれるメソッドを作るという手もあると思います。
やりかたはいろいろあるので考えてみてください。

あとは、turnはstaticじゃなくてもいいんじゃない?という気もしてますが、それも自分でためしてみてください。

投稿2016/08/19 14:31

編集2016/08/22 11:50
flied_onion

総合スコア2604

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

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

0

BoardData#changePieceDatapublicで宣言されていますので、別クラスからもアクセス可能です。

Javaでは、アクセス制御が4通りあります。

  • public…どこからでもアクセス可能
  • package private(無指定)…同じパッケージ内のクラスからアクセス可能
  • protected…自分自身と継承したクラスからアクセス可能
  • private…同じクラスからのみアクセス可能

投稿2016/08/19 14:25

maisumakun

総合スコア145183

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問