再帰性クラス
あるクラスは個人間のつながりをあらわしているとする。ヒトとうクラスを作成しているものとする。ヒトクラスのオブジェクトに、いま個人1がいて、個人2がいるとする。この個人のフィールドには、「父親」というフィールドがあるとして、個人2が個人1の父親だとすると、個人1というヒトクラスオブジェクトのフィールド「父親」の値は、ヒトクラスオブジェクトである個人2であることになる。
このようなとき、クラスの定義は再帰性に行う。次のようになる。
//Profile クラスの定義 class Chromosome { //フィールドの定義 String pId; //ID String pCategory; //カテゴリ('a' or 'b') Chromosome pAncestor1; //第1アンセスター。5'端を持つアンセスター染色体 String pAncestor2; //第2アンセスター。組換え体の場合に、第2のアンセスター String pForm1; //第1アンセスター染色体が父由来('p'か母由来('m')か String pForm2; //第2アンセスター染色体が父由来('p'か母由来('m')か String pRecpoints; //組換え発生点('5\t10\t40'は、5-6,10-11,40-41にて組換えがおきた結果、この染色体が出来上がったことを意味する
このように、pAncestor1フィールドの「型」はChromosomeクラスであることが記載されており、このような定義をしても、問題は発生しない。クラス作成時の再帰性の確認のみがしたかったので、Chromosome.javaソースは当該部分のみをバージョンアップし、"Chromosome4.java"として、テスト実行した。
参考のために、このソースも以下に貼付する。
//Profile クラスの定義
class Chromosome {
//フィールドの定義
String pId; //ID
String pCategory; //カテゴリ('a' or 'b')
Chromosome pAncestor1; //第1アンセスター。5'端を持つアンセスター染色体
String pAncestor2; //第2アンセスター。組換え体の場合に、第2のアンセスター
String pForm1; //第1アンセスター染色体が父由来('p'か母由来('m')か
String pForm2; //第2アンセスター染色体が父由来('p'か母由来('m')か
String pRecpoints; //組換え発生点('5\t10\t40'は、5-6,10-11,40-41にて組換えがおきた結果、この染色体が出来上がったことを意味する
void showProfile(){
//各フィールドの値をコンソール上に表示
System.out.println("*******第" + pId + "染色体の祖先染色体は*****");
System.out.println("第 " + pAncestor1 + " 染色体と第 " + pAncestor2 + " 染色体です");
System.out.println("第" + pId + "は" + pRecpoints + "にて組換えがおきてできた組換え体です");
}//返り値ありのメソッド
String returnString(){
String returnValue;
returnValue = pRecpoints;
return returnValue;}
}
//テスト用クラスの作成
class UseChromosome {
public static void main(String args[]){//Chromosomeクラスのインスタンスを作成
Chromosome myChrom1 = new Chromosome();//Chromosomeクラスのフィールドに値を代入
myChrom1.pId="1";
myChrom1.pCategory="a";
//myChrom1.pAncestor1="";
myChrom1.pAncestor2="";
myChrom1.pForm1="";
myChrom1.pForm2="";
myChrom1.pRecpoints="";//Chromosomeクラスのインスタンスを作成
Chromosome myChrom2 = new Chromosome();//Chromosomeクラスのフィールドに値を代入
myChrom2.pId="2";
myChrom2.pCategory="b";
//myChrom2.pAncestor1="1";
myChrom2.pAncestor2="";
myChrom2.pForm1="";
myChrom2.pForm2="";
myChrom2.pRecpoints="";//Chromosomeクラスのインスタンスを作成
Chromosome myChrom3 = new Chromosome();//Chromosomeクラスのフィールドに値を代入
myChrom3.pId="3";
myChrom3.pCategory="b";
//myChrom3.pAncestor1="1";
myChrom3.pAncestor2="2";
myChrom3.pForm1="f";
myChrom3.pForm2="m";
myChrom3.pRecpoints="5\t10";//メソッドを呼び出す
System.out.println("myChrom1のプロファイルをメソッドで呼び出す\n");
myChrom1.showProfile();
System.out.println("myChrom2のプロファイルをメソッドで呼び出す\n");
myChrom2.showProfile();
System.out.println("myChrom3のプロファイルをメソッドで呼び出す\n");
myChrom3.showProfile();}
}class returnValuetest{
public static void main(String args[]){//Chromosomeクラスのインスタンスを作成
//Chromosomeクラスのインスタンスを作成
Chromosome myChrom1 = new Chromosome();//Chromosomeクラスのフィールドに値を代入
myChrom1.pId="1";
myChrom1.pCategory="a";
//myChrom1.pAncestor1="";
myChrom1.pAncestor2="";
myChrom1.pForm1="";
myChrom1.pForm2="";
myChrom1.pRecpoints="";//Chromosomeクラスのインスタンスを作成
Chromosome myChrom2 = new Chromosome();//Chromosomeクラスのフィールドに値を代入
myChrom2.pId="2";
myChrom2.pCategory="b";
//myChrom2.pAncestor1="1";
myChrom2.pAncestor2="";
myChrom2.pForm1="";
myChrom2.pForm2="";
myChrom2.pRecpoints="";//Chromosomeクラスのインスタンスを作成
Chromosome myChrom3 = new Chromosome();//Chromosomeクラスのフィールドに値を代入
myChrom3.pId="3";
myChrom3.pCategory="b";
//myChrom3.pAncestor1="1";
myChrom3.pAncestor2="2";
myChrom3.pForm1="f";
myChrom3.pForm2="m";
myChrom3.pRecpoints="5\t10";Chromosome myChromR1 = new Chromosome();
myChromR1.pId="10(returntestID)";
myChromR1.pRecpoints=myChrom3.returnString();
System.out.println("myChromR1のpRecpointsにmyChrom3のそれを返り値つきメソッドで返し、、メソッドを介して代入された値を含むChromosomeオブジェクトのフィールドの値を表示させる\n");myChromR1.showProfile();
Chromosome myChromR2 = new Chromosome();
myChromR2.pId="11";
myChromR2.pAncestor1=myChromR1;
System.out.println("myChromR2のpAncestor1にmyChromR1オブジェクトを代入してみた\n");myChromR2.showProfile();
}
}