Помочь разобрать с Конструктором

122
02 июля 2021, 04:10

Как можно вызвать нужный конструктор у класса Sender, когда мы не знаем какой именно передаем Device через цикл?

package devices;
import java.util.ArrayList;
abstract class Device {
    String name;
    String host;
    public String getName() {
        return name;
    }
    public String getHost() {
        return host;
    }
}
class Device1 extends Device {
    Device1 (String name, String host){
        this.name = name;
        this.host = host;
    }
}
class Device2 extends Device {
    Device2 (String name, String host){
        this.name = name;
        this.host = host;
    }
}
class Sender {
    public Sender(Device1 device1) {
        connectSSH(device1.getName(), device1.getHost());
    }
    public Sender(Device2 device2) {
        connectTelnet(device1.getName(), device1.getHost());
    }
    void connectSSH(String name, String host){
        тут выполняется коннект по протоколу SSH;
    }
    void connectTelnet(String name, String host){
        тут выполняется коннект по протоколу Telnet;
    }
}
class Main {
    public static void main(String[] args) {
        ArrayList<Device> devices = new ArrayList<Device>();
        devices.add(new Device1("Device1", "PC100"));
        devices.add(new Device2("Device2", "PC200"));
        for (int i = 0; i < devices.size(); i++) {
            Sender sender = new Sender(devices.get(i));//Не создаёт объект Serndr без приведения типов
        }
    }
}
Answer 1

У вас ошибка в архитектуре. Вам нужно в класс Sender передавать объект класса Device. А какой именно - сендеру все равно.

Если для конкретного класса нужно производить какие-то специфические действия, до эти действия имеет смысл вынести в сам класс

abstract class Device {
    private final String name;
    private final String host;
    Device(String name, String host){
        this.name = name;
        this.host = host;
    }
    public String getName() {
        return name;
    }
    public String getHost() {
        return host;
    }
    public abstract void connect();
}
class Device1 extends Device {
    Device1 (String name, String host){
        super(name, host);
    }
    @Override
    public void connect() {
      // connect to SSH
    }
}
class Device2 extends Device {
    Device2 (String name, String host){
        super(name, host);
    }
    @Override
    public void connect() {
      // connect to Telnet
    }
}
class Sender {
    public Sender(Device device) {
        device.connect());
    }
}
class Main {
    public static void main(String[] args) {
        ArrayList<Device> devices = new ArrayList<Device>();
        devices.add(new Device1("Device1", "PC100"));
        devices.add(new Device2("Device2", "PC200"));
        for (int i = 0; i < devices.size(); i++) {
            Sender sender = new Sender(devices.get(i));
        }
    }
}