2012-03-22 21 views
0

ECJ(進化的アルゴリズムパッケージ)を使用していますが、拡張クラスの特定の変数を呼び出したいのですが、問題クラスからどのように取得するのか分かりません。ECJの親クラスの拡張クラス変数を呼び出す

以下の問題クラスでわかるように、NetworkGeneクラスで変数xを呼び出せますが、変数yを呼び出すことができるVectorGeneクラスになってしまいます。

class Problem { 
    double fitness = 0; 
    public void evaluate(final Individual ind){ 
    if(!(ind. instanceOf GeneVectorIndividual)){ 
     state.output.fatal("Not a GeneVectorIndividual",null); 
    } 
    fitness = 0; 
    for(){ 
     fitness += ind.genome[i].x; 
    }  
    } 
} 

public abstrabct class VectorIndividual extends Individual{ 
} 

public class GeneVectorIndividual extends VectorIndividual{ 
    VectorGene[] genome; 
} 

public abstract class VectorGene implements Prototype { 
    double y; 
} 

public class NetworkGene extends VectorGene{ 
    double x; 
} 

答えて

1

古典的な多型性の問題。

迅速かつ汚いソリューションはこれです:クラスProblemforループ内で、これらの行

if (ind.genome[i] instanceof NetworkGene) { 
    fitness += ((NetworkGene) ind.genome[i]).x; 
} 

を追加しかし、おそらくあなたが解決する必要がある設計上の問題があります:

なぜind.genome配列でありますNetworkGenesの代わりにVectorGenesの?

xは何を表していますか? を返すように実装するNetworkGeneのメソッドgetSomeValue()のようなVectorGene内に表現できるものがありますか(他のサブクラスでは他の適切な値を返すために実装します)。あなたは本当にVectorGeneNetworkGene継承関係を

必要です - それはあなたが実際にあなたが現在解決しようとしている問題に活用するために必要ないくつかの違いに関連していますか?プロパティxyを含む単一のクラスを持つことができませんでしたか?

+0

私は標準パッケージを使用しています。彼らは多くの継承関係を使用して、プログラムをあらゆる種類の問題に適用できるようにしました。 VectorGeneオブジェクトはパッケージ内の標準オブジェクトであり、NetworkGeneオブジェクトは私が作成したオブジェクトです。これはマニュアルの標準的な方法です。パラメータファイルは、NetworkGeneオブジェクトを使用するようにプログラムに指示します。私は全体のプログラムが非常に混乱していることがわかり、実装方法のためにすべてがどのように継承されているかわかりません。 – Danielle

+0

ああ、フレームワークの喜び。 OK、その場合、NetworkGeneが 'getFitness()'のように実装できる抽象メソッドで設計されていない場合は、私が提案した素早く汚れた解決策以外のことはあまりありません。 –

+0

この素早く汚れたメソッドを追加しても、シンボル(x変数)が見つからないというエラーメッセージが表示されます。これらの変数は、問題を説明するための単なるダミーです。 – Danielle

関連する問題