вызвать расширенную переменную класса в parent в ECJ - PullRequest
0 голосов
/ 22 марта 2012

Я использую ECJ (пакет эволюционных алгоритмов) и хочу вызвать определенные переменные, которые находятся в расширенном классе, но я не могу понять, как добраться до них из класса задачи.

КакВы можете видеть в классе задачи ниже. Я хочу иметь возможность вызывать переменную x в классе NetworkGene, но это не работает, потому что я попал в класс VectorGene, в котором я могу вызывать только переменную y.

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 Ответ

1 голос
/ 22 марта 2012

Классическая проблема полиморфизма.

Быстрое и грязное решение заключается в следующем: в цикле for в классе Problem добавьте эти строки

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

Но, вероятно, есть дизайнПроблема, которую нужно решить:

Почему ind.genome является массивом VectorGenes вместо NetworkGenes?

Что означает x?Есть ли что-то, что вы могли бы выразить в VectorGene, например метод getSomeValue(), который в NetworkGene вы бы реализовали так, чтобы он возвращал x (а в других подклассах вы бы реализовали это, чтобы вернуть какое-то другое подходящее значение)?

Действительно ли вам нужно отношение наследования между VectorGene и NetworkGene - связано ли это с некоторой разницей, которую вам действительно нужно использовать в проблеме, которую вы в настоящее время пытаетесь решить?Не могли бы вы просто иметь один класс, содержащий свойства x и y?

...