繁体   English   中英

用隐藏的构造函数扩展类

[英]Extending class with hidden constructors

我有一个基类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; }
    }
}

现在,我想将FiniteStateMachineState类都扩展为MyFSMMyState类。 我仍然要确保只能通过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)方法,而是addState(name)进行残废处理并引发异常,而是放置一个全新的方法来返回新类。

如果有针对这些情况的编码模式,我将不会意识到。 但是我想知道,所以我不会再发明轮子了。

如果使列表变量受保护,则也可以从子类访问它,而无需添加方法。 这取决于您以后要执行的操作以及列表的可见性。 如果希望能够从继承层次结构之外添加状态,或者不希望列表在整个包中可见,则可能需要使用addState方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM