我有一个基类FiniteStateMachine
,其列表为State
。状态只能通过FSM实例化,因此我可以确保更新列表。
public class FiniteStateMachine {
private List<State> states = new ArrayList<State>();
public State addState(String name) {
State s = new State(name);
states.add(s);
return s;
}
protected void addState(State s) {
states.add(State s);
}
public static class State {
private String name;
protected State(String name) { this.name = name; }
}
}
现在,我想将FiniteStateMachine
和State
类扩展为MyFSM
和MyState
类。我仍然希望确保只能通过FSM创建新的MyState
状态,以确保它们是列表的一部分。
这是我到目前为止所做的:
public MyState extends FinitStateMachine.State {
private int n;
protected MyState(int n, String name) {
super(name);
this.n = n;
}
}
public MyFSM extends FiniteStateMachine {
@Override
public State addState(String name) {
throw new UnsupportedOperationException();
}
public MyState addState(int n, String name) {
MyState s = new MyState(n, name);
super.addState(s);
return s;
}
}
我不确定我做得对。
首先,原始的State
类是FiniteStateMachine
的内部类,在这里我将它扩展到我的新课程MyFSM
之外。
其次,我必须在原始FiniteStatMachine
protected void addState(State s) {
states.add(State s);
}
否则我不知道如何将新MyState
类的状态附加到FiniteStateMachine
列表中。
第三,我没有覆盖addState(name)
方法,而是瘫痪了它并抛出异常,而是提出了一个全新的方法来返回新类。
如果这些情况有编码模式,我不知道。但我想知道,所以我不去重新发明轮子。
答案 0 :(得分:0)
如果使列表变量受到保护,您也可以从子类访问它,而不使用add方法。这取决于您以后想要做什么,以及您希望列表有多可见。如果您希望能够从继承层次结构外部添加状态,或者您不希望列表在整个包中可见,则可能需要addState方法。