Java: metody Undo i Redo dla klasy Rectangle [duplikat]
Oct 16 2020
Mam niestandardową klasę Rectangle:
public class Rectangle () {
private int height, width, x, y;
private Color color;
public Rectangle () {
this.height = null;
this.width = null;
this.x = null;
this.y = null;
this.color = null;
}
public void setHeight(int h) { this.height = h; }
public void setWidth(int w) { this.width = w; }
public void setX(int x) { this.x = x; }
public void setY(int y) { this.y = y; }
public void setColor(Color c) { this.color = c; }
public int getWidth() { return this.width; }
public int getHeight() { return this.height; }
public int getX() { return this.x; }
public int getY() { return this.y; }
public Color getColor() { return this.color; }
public void undo() { }
public void redo() { }
}
Jak powinienem zaimplementować funkcje cofania i ponawiania dla tej klasy w taki sposób, aby mogła ona przywrócić prostokąt do poprzedniego stanu bez wspominania przez użytkownika, która metoda była ostatnio używana. Mam niejasny pomysł na użycie stosu, ale utknąłem na tym, jak go zakodować. Moje drugie pytanie brzmi: nie jestem pewien, czy mój konstruktor jest poprawny. Inicjalizuję wszystko na null bez podawania żadnych parametrów, ponieważ chcę, aby ludzie zamiast tego używali metod pobierających / ustawiających. Proszę pomóż.
Odpowiedzi
1 Harkal Oct 16 2020 at 12:37
możesz zapisać stan w tablicy i przywrócić z niej prostokąt
public class Rectangle () {
private states: List<Rectangle> = new ArrayList(); // we save the state of rectangle on every update to any property
private int stateIndex = 0; // this is the index of the state which is active on this rectangle
private int height, width, x, y;
private Color color;
public Rectangle () {
this.height = null;
this.width = null;
this.x = null;
this.y = null;
this.color = null;
}
public void setHeight(int h) {
this.stateIndex = states.size() + 1; // we ll increase one in state index as new state is added to the states
this.height = h;
this.states.add(this); // add the state after you set the value of any property
}
public void undo() {
if(this.stateIndex > 0){ // only undo when there is state available before the current state
this.stateIndex--; // reduce the current index by one
this.height = this.states.get(stateIndex).height; // set the properties from state
...
}
}
public void redo() {
if(this.stateIndex < states.size()){ // can go more the available states in cache
this.stateIndex++; // increase the current state index
this.height = this.states.get(stateIndex).height; // update the values of the properties
...
}
}
}