Вызов другого конструктора в зависимости от типа stati c созданного экземпляра - PullRequest
0 голосов
/ 09 апреля 2020

У меня есть программа, в которой классная машина реализует два интерфейса: арендуемый и покупаемый.

Мой класс выглядит примерно так:

Class Car implements IRentable, IBuyable{
   private String name;
   private float rentValue;
   private float sellValue;

   //rentable constructor
   public Car(String name, float rentValue){
   ...
   }
   //buyable constructor
   public Car(String name, float buyValue){
   ...
   }
   ...
}

И создание экземпляра объекта будет выглядеть примерно так например:

IRentable c1= new Car("name",700f);
IBuyable c2= New Car ("name",35_000f);

Мне было интересно, есть ли способ вызвать конкретный c конструктор, основанный на типе объекта * stati c. Например, если у меня есть тип IRentable:

IRentable c1= new Car("name",700f);

, вызовите рентабельный конструктор. Если у меня есть тип IBuyable:

IBuyable c2= New Car ("name",35_000f);

, вызовите конструктор с возможностью покупки.

Ответы [ 5 ]

0 голосов
/ 09 апреля 2020

Вы не можете создать более 1 конструктора с одинаковыми сигнатурами типа. Если предполагается, что автомобиль может быть только Rentable или Buyable, вы можете создать единый интерфейс, который расширяет оба вышеупомянутых интерфейса, например Costable (плохое имя, я знаю).

interface Costable {
    float amount();
}

Затем составьте Car of a Costable object.

class Car implements Costable {

    private final Costable;

    public Car(Costable costable) {
        this.costable = costable;
    }

    @Override
    public float amount() {
        return costable.amount();
    }
}

Тогда вы можете расширить Rentable / Buyable с помощью ваших реализаций. Вот пример с IRentable, как у вас выше.

class IRentable implements Costable {

    private final float amount;

    public IRentable(float amount) {
        this.amount = amount;
    }

    @Override
    public float amount() {
        return amount;
    }
}
Costable rentable = new Car(new IRentable(1_000));
0 голосов
/ 09 апреля 2020

Этого можно добиться, изменив порядок параметров в двух конструкторах:

interface IRentable {

}

interface IBuyable {

}

class Car implements IRentable, IBuyable {
    private String name;
    private float rentValue;
    private float sellValue;

    // rentable constructor
    public Car(float rentValue, String name) {

    }

    // buyable constructor
    public Car(String name, float buyValue) {

    }

}

public class Main {
    public static void main(String[] args) {
        IRentable c1 = new Car(700f, "name");
        IBuyable c2 = new Car("name", 35_000f);
    }
}
0 голосов
/ 09 апреля 2020

Я думаю, что для этого случая вы должны рассмотреть шаблон строителя или, если вам нужны только эти два конструктора, вы можете сделать конструктор all args частным и создать два метода c stati, которые будут создавать ваши объекты соответственно.

0 голосов
/ 09 апреля 2020

Используйте stati c методы, которые можно назвать, чтобы уточнить разницу. Сделайте конструктор private.

class Car implements IRentable, IBuyable {
    private String name;
    private float rentValue;
    private float buyValue;

    public static IRentable rent(String name, float rentValue) {
        return new Car(name, rentValue, Float.NaN);
    }

    public static IBuyable buy(String name, float buyValue) {
        return new Car(name, Float.NaN, buyValue);
    }

    private Car(String name, float rentValue, float buyValue) {
        ...
    }

    ...
}

Они используются так:

IRentable c1 = Car.rent("name", 700f);
IBuyable c2 = Car.buy("name", 35_000f);
0 голосов
/ 09 апреля 2020

Это невозможно, поскольку разные конструкторы нуждаются в разных сигнатурах методов. У вас может быть один конструктор с флагом в качестве третьего параметра:

IRentable c1= new Car("name",700f,true);
IBuyable c2= New Car ("name",35_000f,false);
...