Bom, vou simplificar, porque acho que para você é muito mais importante o conceito do que a solução específica para o seu problema.
Você tem uma estrutura mais ou menos assim: Três classes, onde a classe 2 e 3 herdam da classe 1.
// código para Class1
public class Class1 {
private int id; // id para todas as classes que herdam de Class1
// assim, Class2 e Class3 "compartilham" o mesmo id
public void setId(int id) {
this.id = id;
}
public int getId() {
return id;
}
}[/code][code]
// código para Class2
public class Class2 extends Class1 {
private int var2;
public void setVar2(int var2) {
this.var2 = var2;
}
public int getVar2() {
return var2;
}
}[/code][code]
// código para Class3
public class Class3 extends Class1 {
private int var3;
public void setVar3(int var3) {
this.var3 = var3;
}
public int getVar3() {
return var3;
}
}[/code]
Observe que o atributo id é herdado pelas classes 2 e 3.
Convém observar que, pela forma com que a linguagem java foi implementada, ela é naturalmente polimórfica. Em C++, isso que vou lhe mostrar agora só seria possível se os métodos usados no polimorfismo fossem declarados virtuais. Não vou entrar em detalhes nisso, mas o importante é o que uma referência do tipo Class1 pode ser usada para processar polimorficamente as Class2 e Class3.
Suponhamos que os seus objetos Class2 estejam em vector2 e as Class3 em vector3:
[code]Vector<Class2> vector2 = new Vector<Class2>();
Vector<Class3> vector3 = new Vector<Class3>();
Bom, vou colocar nos construtores das classes a inicialização de “id”. Fica assim:
[code]
// código para Class1
public class Class1 {
private int id; // id para todas as classes que herdam de Class1
// assim, Class2 e Class3 “compartilham” o mesmo id
public Class1(int id) { // construtor para a superclasse
setId(id);
}
public void setId(int id) {
this.id = id;
}
public int getId() {
return id;
}
}[/code][code]
// código para Class2
public class Class2 extends Class1 {
private int var2;
public Class2(int id) { // construtor para Class2
super(id);
}
public void setVar2(int var2) {
this.var2 = var2;
}
public int getVar2() {
return var2;
}
}[/code][code]
// código para Class3
public class Class3 extends Class1 {
private int var3;
public Class3(int id) { // construtor para Class3
super(id);
}
public void setVar3(int var3) {
this.var3 = var3;
}
public int getVar3() {
return var3;
}
}[/code]
Bem, uma solução burra (burra mesmo, mas dá pra aprender alguma coisa) é varrer as duas vectors e perguntar se alguém tem um id igual ao que você pretender dar à nova classe.
// função que retorna o próximo id a ser usado
public int obterId() throws RuntimeException {
// obter o id único
for (int id=0; id<Integer.MAX_VALUE; id++) { // tentar vários ids
boolean repetido = false;
for (int i=0; i<vector2.size(); i++) { // varrer vector2
if (vector2.get(i).getId()==id) {
repetido = true;
break;
}
}
if (!repetido) {
for (int i=0; i<vector3.size(); i++) { // varrer vector3
if (vector3.get(i).getId()==id) {
repetido = true;
break;
}
}
}
if (!repetido) { // se ninguém tem o mesmo id
return id;
}
}
// se não achou nenhum id entre os inteiros disponíveis, já se esgotaram os ids
throw new RuntimeException("acabaram os ids");
}
Daí, para criar um objeto (suponha da classe 2), você pode fazer:
int id = obterId();
vector2.add( new Class2(id));
Bom, depois eu mando (se eu me lembrar…) uma solução mais inteligente, onde os dois tipos de objetos ficam armazenados em um único vector (de Class1, que pode processar polimorficamente Class2 e Class3).