我写下了类似下面的代码:
abstract class ZmqSubscriber {
protected String zmqPort, zmqIp, zmpTopic;
public void start() {
init();
// connect to zeroMQ with initialized zmq port, ip, topic and receive data
}
abstract protected void init();
}
abstract class Collector extends ZmqSubscriber {
@Override
protected void init() {
super.zmqIp = this.zmqIp;
super.zmqPort = this.zmqPort;
super.zmqTopic = this.zmqTopic;
}
public void otherMethod() { //blablabla }
}
class Syncronizer extends ZmqSubscriber() {
//blablabla
}
class SensorCollector extends Collector {
private String zmqPort, zmqIp, zmpTopic;
@Override
protected void init() {
//this.zmqIp, this.zmpPort, this.zmqTopic will be already initialized at this moment
super.zmqIp = this.zmqIp;
super.zmqPort = this.zmqPort;
super.zmqTopic = this.zmqTopic;
super.init();
}
// getters & setters for zmq port, ip, topic
}
class BeconCollector extends Collector {
// blablabla like SensorCollector
}
我绝对需要三级扩展,这段代码运行良好。 但我认为在子类中初始化超类的实例变量(zmqPort,zmqIp,zmqTopic)的方式并不优雅,我不能确切地说为什么我觉得这部分不优雅,但我只是“感觉”它不是当我查看代码时,也许是因为init()方法中的重复代码......
有人会建议更优雅的建筑吗?
感谢
答案 0 :(得分:0)
我有一个建议,你的类SensorCollector
正在遮蔽父变量名,这是不好的做法。这会导致混乱。
我认为你可以通过避免变量阴影来清理你的代码:
abstract class ZmqSubscriber {
protected String zmqPort, zmqIp, zmpTopic;
public void start() {
// connect to zeroMQ with initialized zmq port, ip, topic and receive data
System.out.println("connecting :" + zmqIp + ":" + zmqPort + " for topic : " + zmpTopic);
}
// some abstract method...
}
class SensorCollector extends ZmqSubscriber {
public SensorCollector(String zmqPort, String zmqIp, String zmpTopic) {
this.zmqPort = zmqPort;
this.zmqIp = zmqIp;
this.zmpTopic = zmpTopic;
}
// implementation for some abstract method...
}
public class Main {
public static void main(String[] args) {
SensorCollector sensorCollector = new SensorCollector("8080", "0.0.0.0", "zeroMQ");
sensorCollector.start();
}
}