我正在开发一个需要允许用户覆盖核心功能的研究框架。
我有一个名为TorSocket的核心类,它有一个名为createCircuit()
的方法,它返回一个TorCircuit类。我希望框架的用户能够在不修改源的情况下覆盖TorCircuit函数,但因为创建这样一个类的唯一方法是通过TorSocket.createCircuit()
我不知道如何。
我在TorSocket中尝试如下,创建一个成员变量:
public Class circuitClass;
然后用户可以这样做:
sock.circuitClass = class MyCircuitClass extends TorCircuit { ...
并且TorSocket类将使用circuitClass来实例化。
但是,我在“class”上使用上面的代码时出现语法错误。这个的正确语法是什么?虽然欢迎指点,但我无法在线找到。
最后,我如何使用TorSocket.circuitClass
来实例化?
非常感谢 加雷
答案 0 :(得分:1)
使用
class MyCircuitClass extends TorCircuit {...}
sock.circuitClass = MyCircuitClass.class;
答案 1 :(得分:0)
您不能让您的用户扩展您的基类,但仍然希望自己控制对象的创建(您将如何做到这一点?用户只需调用new MyCircuitClass()
) - 如果您想集中精力在一个工厂类中创建对象并让用户只需要提供扩展行为我建议创建一组基类正在使用的接口,用户必须通过工厂提供具体实现来创建对象。 / p>
答案 2 :(得分:0)
似乎更好的方法是使用像这样的Generic方法:
public <T extends TorCircuit> T createCircuit(Class<T> torCircClass, boolean blocking) {
T circ;
try {
circ = torCircClass.getDeclaredConstructor(TorSocket.class).newInstance(this);
} catch (InstantiationException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e) {
throw new RuntimeException(e);
}
circ. ...
return circ;
}