@s0bieskii:
Spróbuj tak. Wtedy kod o wiele prostszy i jak wprowadzisz następną figurę dziedziczącą z Figury to dalej będzie działać bez przerabiania ;-)
private static void move(Picture picture, int i) {
Figure f = picture.getFigure(i-1);
if (f == null) {
System.out.println("Brak elementu w kolekcji");
} else {
f.move(v.getDx(), v.getDy());
}
}
żebyś tylko mógł się odwoływać w ten sposób do metody f.move(int dx, int dy) a Twój program "wiedział" jakiej klasy obiekt chcesz przesunąć to musisz albo:
a) stworzyć interface np.
interface IFigury{
void move(int dx, int dy);
}
a twoje klasy (konkretne figury i obraz) muszą go zaimplementować, czyli np tak:
class Linia implements IFigury {
protected Punkt P1, P2;
@Override
public void move(int dx, int dy) {
P1.move(dx, dy);
P2.move(dx, dy);
}
}
adnotacja @Override której widziałem, że używasz "podpowiada kompilatorowi", że nadpisujesz metodę, która jest wirtualna (!), czyli zdefiniowana wcześniej w interface lub w klasie bazowej abstrakcyjnej (lub nie) z której dziedziczysz. Bez adnotacji też działa tak samo, ale gdy zrobisz np literówkę, to zamiast nadpisać wirtualną metodę z klasy bazowej wprowadzisz niechcący nową metodę.
(!) W Javie wszystkie metody niestatyczne są wirtualne.
Spójrz teraz na rozwiązanie b. Teraz będzie bez interfejsów.
b)
public abstract class Figure {
public abstract void move(int dx, int dy);
class Linia extends Figure {
protected Punkt P1, P2;
@Override
public void move(int dx, int dy) {
P1.move(dx, dy);
P2.move(dx, dy);
}
}
Zrobienie metody abstract (która zauważ nie ma implementacji), wymusza na Tobie nadpisanie jej w klasach dziedziczących z klasy abstrakcyjnej.