プロが教えるわが家の防犯対策術!

Java初心者です。
学習中に躓いてしまったので、ご教示いただければと思います。

Testという1つのクラスを作成し、
そこから複数のインスタンスを作成します。
Test test1 = new Test();
Test test2 = new Test();
Test test3 = new Test();

元のTestクラスの中に、
public void addSub(Test child)
という、引数に指定したインスタンスを子に登録するメソッドを用意します。

実際に使うときは、
test1.addSub(test2);
とすれば、test1の子にtest2が登録されるようにしたいのです。

基本的にサブクラスにするには、クラスを作る段階でextendsを用いるイメージなので、同じクラスの別インスタンスを親子関係にする、というのがよく分かりません。

このプログラムの目的は、最終的に一番親となったインスタンス(test1)の合計メソッドを呼び出して、自分の子供に登録されているインスタンス(test2,test3)全ての値を合算するということです。

質問の方法が曖昧で分かりにくいと思いますが、
指示いただければ追記いたしますので、
お時間のある方お力を貸していただければと思います。

宜しくお願いします。

A 回答 (4件)

>public void addTest(Test child){


>this.child = child;
>}
>これは、test1(元インスタンス)=test2(引数のほう)にするということ>でしょうか。

test1のメンバ変数にtest2を設定しています。

>少し違っていて、
>test1.addTestでよびだしたとして、
>test1の子(サブインスタンス?)にchild(=test2など)としたいと思っ>ています。

すいません。ここ全然意味が理解できないです・・・

>そして、本来の目的は
>最後にtest1.totalという風に呼び出したときに、
>testクラスにある、
>public int total(){
>test1の子インスタンス(addTestで引数に指定した全てのインスタン>ス)のscoreを全て足す
>}
>ということをしたいと思っています。

では

public class TestMain {
public static void main(String[] args){
Test test1 = new Test(1);
Test test2 = new Test(2);
Test test3 = new Test(3);
test1.addTest(test2);
test1.addTest(test3);
System.out.println(test1.total());
}
}

class Test{
Test(int score){
this.score = score;
}
public int score;
public List<Test> childList = new ArrayList<Test>();
public void addTest(Test child){
this.childList.add(child);
}
public int total(){
int result = this.score;
for(Test child : this.childList){
result += child.score;
}
return result;
}
}
それではこういうこと?
    • good
    • 0

 #2です。



 ちょっと、コードが間違ってました。

public void addTest(Test child) {
  if (this.child == null) {
    this.child = child;
  } else {
    this.child.addTest(child);
    ↑ここ変更。
  }
}

 メソッドの引数とインスタンス変数の名前を同じにするとややこしくなっちゃいますね。
    • good
    • 0

 こんにちは。



>少し違っていて、
>test1.addTestでよびだしたとして、
>test1の子(サブインスタンス?)にchild(=test2など)としたいと思っています。

 ここは、#1さんの方法で間違っていませんよ。
 これで、ちゃんと test1 の変数 child に test2 のインスタンスが登録されます。

 ただ、もし、数珠つなぎにするという仕様であっているのなら、addTestメソッドは、

public void addTest(Test child) {
  if (this.child == null) {
    this.child = child;
  } else {
    child.addTest(child);
  }
}

 この方が、簡単に数珠つなぎになるんじゃないですか。

 あと、totalメソッドですが、ごく単純に、

public int total(){
  int result = num;
  if (child != null) {
    result += child.total();
  }
  return result;
}

 これで、再帰的にそれぞれのインスタンスが自分の子のトータルを呼び出して、万事うまくいくと思いますよ。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

すみません、#1さんのが正しかったんですね。
初心者すぎてちゃんと理解できていませんでした。
御指摘ありがとうございました。
#1さん、すみませんでした。

そうです、やりたかったことは数珠繋ぎです。
(そのような言葉はまったく浮かんでいませんでした。。。)
再帰処理を用いればいいんですね!
頭がだいぶすっきりしました。
整理してやってみます!

本当にありがとうございました<(_ _)>

お礼日時:2009/06/23 10:02

public class TestMain {


public static void main(String[] args){
Test test1 = new Test(1);
Test test2 = new Test(2);
Test test3 = new Test(3);
test2.addTest(test3);
test1.addTest(test2);

System.out.println(test1.num + test1.child.num + test1.child.child.num);
}
}

class Test{
Test(int num){
this.num = num;
}
public int num;
public Test child;
public void addTest(Test child){
this.child = child;
}
}

こういうかんじのことがしたいんですか?

この回答への補足

回答ありがとうございます。

public void addTest(Test child){
this.child = child;
}
これは、test1(元インスタンス)=test2(引数のほう)にするということでしょうか。

少し違っていて、
test1.addTestでよびだしたとして、
test1の子(サブインスタンス?)にchild(=test2など)としたいと思っています。

そして、本来の目的は
最後にtest1.totalという風に呼び出したときに、
testクラスにある、
public int total(){
test1の子インスタンス(addTestで引数に指定した全てのインスタンス)のscoreを全て足す
}
ということをしたいと思っています。
(自動的に子インスタンス全てを呼んでくる、という方法があるのか、という疑問もあるのですが)

これで説明になっていますでしょうか・・・
何分初心者で言葉の意味が曖昧なところがあるので伝わりにくくてすみません。

補足日時:2009/06/22 18:26
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!