Назначение объекта с помощью реализации
Я пытаюсь разобраться с интерфейсами и их реализацией на 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();
Вы говорите: "Я собираюсь иметь дело с новым автомобилем так, что не имеет значения, что это за автомобиль".
Так что, да, соглашение о кодировании или стиль кодирования в значительной степени.
В контексте этой ситуации они одинаковы. Если у вас есть определенная функциональность в любом из производных классов, вам нужно будет использовать последний, если вы захотите вызвать эту функциональность позже при обработке, когда она находится в области видимости (без приведения).
Это не имеет значения в этих заявлениях, и считается плохой практикой использования последних.