Назначение объекта с помощью реализации

Я пытаюсь разобраться с интерфейсами и их реализацией на Java.

У меня есть интерфейс и 3 класса, 2 из которых реализуют интерфейс. Реализация интерфейса требует 2 метода,

  • toString() [который использует @Overide здесь для удовлетворения Netbeans] и
  • wheelCount(),

    открытый интерфейс IVehicle {
    @Override public String toString (); public int wheelCount ();
    }

Затем у нас есть два класса Bike и Car.

public class Bike implements IVehicle{
    @Override
    public int wheelCount() {
        return 2;
    }
    @Override
    public String toString(){
        String s = "This is a Bike with " + wheelCount() + " wheels!";
        return s;
    }
}

public class Car implements IVehicle{
    @Override
    public int wheelCount() {
        return 4;
    }
    @Override
    public String toString(){
        String s = "This is a Car with " + wheelCount() + " wheels!";
        return s;
    }
}    

Какой-то другой класс называется myClass содержит метод для распечатки материала... printStuf()

public void prntStuf(IVehicle myVehicle){
    String s = myVehicle.toString();
    System.out.println(s);
}

Предполагая, что экземпляр myClass создается, если где-то в коде мы создаем экземпляры Bike() а также Car() и мы передаем эти объекты в метод prntStuf Какова будет польза от использования любого из этих назначений.

IVehicle x = новый автомобиль ()

    IVehicle modeoftransport1 = new Car();
    IVehicle modeoftransport2 = new Bike();

В отличие от... Car x = new Car()

    Car modeoftransport1 = new Car();
    Bike modeoftransport2 = new Bike();

Есть ли реальная разница или выгода, или это сводится к соглашениям о кодировании?

Из того, что я могу сказать, они оба имеют одинаковый эффект, поскольку они оба дают одинаковый результат. Я просмотрел предыдущие вопросы здесь и искал в Интернете, но не могу понять, как это сделать. Надеюсь, это имеет смысл.

3 ответа

Решение

В вашем примере тип переменной не имеет значения.

Выбор типа - это действительно выбор того, что вы собираетесь делать с переменной позже. Когда ты сказал:

Car modeoftransport1 = new Car();

Вы говорите: "Я собираюсь иметь дело с новым автомобилем так, чтобы это значило, что это автомобиль"; например, если у Car были какие-то другие, специфичные для Car, методы, возможно, вы собираетесь их вызывать. Когда ты сказал:

IVehicle modeoftransport1 = new Car();

Вы говорите: "Я собираюсь иметь дело с новым автомобилем так, что не имеет значения, что это за автомобиль".

Так что, да, соглашение о кодировании или стиль кодирования в значительной степени.

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

Это не имеет значения в этих заявлениях, и считается плохой практикой использования последних.

Другие вопросы по тегам