寻求更优雅的方法从子类初始化超类的变量

时间:2017-04-25 06:27:30

标签: java subclass superclass

我写下了类似下面的代码:

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()方法中的重复代码......

有人会建议更优雅的建筑吗?

感谢

1 个答案:

答案 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();
  }
}