Definizione della classe base e delle sottoclassi.
public class Ingranaggio {
public static class Dimensione {
public final int altezza, larghezza, profondita;
public Dimensione(int a, int l, int p) {
altezza = a;
larghezza = l;
profondita = p;
}
}
private final String codice;
private final Dimensione dim;
public Ingranaggio(String c, Dimensione d) {
codice = c;
dim = d;
}
public String getCodice() { return codice; }
public Dimensione getDimensione() { return dim; }
@Override
public boolean equals(Object o) {
if (o == null || !(o instanceof Ingranaggio)) return false;
return codice.equals(((Ingranaggio)o).codice);
}
}
import java.util.*;
public class IngrSemplice extends Ingranaggio {
private final String tipo;
private Ingranaggio[] compatibili = new Ingranaggio[0];
public IngrSemplice(String c, Dimensione d, String t) {
super(c, d);
tipo = t;
}
public String getTipo() { return tipo; }
public boolean isCompatibile(Ingranaggio ingr) {
if (ingr == null) return false;
for (int i = 0 ; i < compatibili.length ; i++)
if (compatibili[i].equals(ingr))
return true;
return false;
}
public boolean add(Ingranaggio ingr) {
if (isCompatibile(ingr)) return false;
compatibili = Arrays.copyOf(compatibili, compatibili.length + 1);
compatibili[compatibili.length - 1] = ingr;
return true;
}
}
import java.util.*;
public class IngrComposto extends Ingranaggio {
private Ingranaggio[] componenti = new Ingranaggio[0];
public IngrComposto(String c, Dimensione d) {
super(c, d);
}
public int componentCount(Ingranaggio ingr) {
int cont = 0;
for (int i = 0 ; i < componenti.length ; i++) {
if (componenti[i].equals(ingr)) {
cont++;
} else if (componenti[i] instanceof IngrComposto) {
cont += ((IngrComposto)componenti[i]).componentCount(ingr);
}
}
return cont;
}
public void add(Ingranaggio ingr) {
if (ingr == null)
throw new IllegalArgumentException();
if (ingr instanceof IngrComposto) {
if (((IngrComposto)ingr).componentCount(this) > 0)
throw new IllegalArgumentException();
}
componenti = Arrays.copyOf(componenti, componenti.length + 1);
componenti[componenti.length - 1] = ingr;
}
}
Il metodo getCompSemplici()
della classe IngrComposto
.
private static IngrSemplice[] addIngrS(IngrSemplice[] array, IngrSemplice...ingr) {
int n = array.length;
array = Arrays.copyOf(array, n + ingr.length);
System.arraycopy(ingr, 0, array, n, ingr.length);
return array;
}
public IngrSemplice[] getCompSemplici() {
IngrSemplice[] ps = new IngrSemplice[0];
for (int i = 0 ; i < componenti.length ; i++) {
if (componenti[i] instanceof IngrSemplice) {
ps = addIngrS(ps, (IngrSemplice)componenti[i]);
} else if (componenti[i] instanceof IngrComposto) {
ps = addIngrS(ps, ((IngrComposto)componenti[i]).getCompSemplici());
}
}
return ps;
}