#java
#java
Вопрос:
У меня есть задача сделать полиморфизм, но я не совсем уверен, что понимаю концепцию согласно показаниям моего учителя.
Согласно веб-определениям и примерам, это, безусловно, полиморфизм, но они говорят, что это не так. Могу ли я, пожалуйста, получить подтверждение?
OversizedParcel.java
public class OversizedParcel implements ParcelType {
public void resolve(PrivateUser user) {
//do theese
//and those
}
public void resolve(LegalUser user) {
//do different thing
//and a completely different thing
}
}
IllegalParcel.java
public class IllegalParcel implements ParcelType {
public void resolve(PrivateUser user) {
//do this
//do that
}
public void resolve(LegalUser user) {
//do a thing
//do a different thing
}
}
(гипотетический класс)
public class Main{
private User user; //loaded user
private List<ParcelType> parcels; //assume this contains the loaded parcels already
public static void main(String[] args){
for(ParcelType type : parcels) type.resolve(user);
}
}
Комментарии:
1. но они говорят, что это не так вы просили своего учителя обосновать это решение?
2. Wiki , первое предложение. Ваш код удовлетворяет этому.
3. Да, это полиморфизм.
4. У вас действительно есть проблема здесь, что это, вероятно, не будет компилироваться, поскольку ваш интерфейс (который вы не указали) не имеет метода
resolve(User)
, и поскольку Java определяет, какой метод вызывать по статическому типу аргумента, ваше использование перегрузки не будет работать.5. Кстати, здесь не нужно добавлять
Type
к имени класса, просто используйтеParcel
.
Ответ №1:
Полиморфизм может быть определен как —
это способность объекта принимать множество форм
. Наиболее распространенным примером полиморфизма может быть-
когда ссылка на родительский класс используется для ссылки на объект дочернего класса.
Итак, согласно вашему вопросу, наиболее упрощенным способом полиморфизм может быть определен как
ParcelType oversizedparcel = new oversizedParcel();
ParcelType illegalparcel = new illegalParcel();
Здесь ParcelType
может быть oversizedParcel
или illegalparcel
Итак, если ваше понимание соответствует моему ответу, то действительно это пример полиморфизма.
Ответ №2:
Я хотел бы высказать особое мнение от того, что, как представляется, здесь большинство. Имейте в виду, что «полиморфизм» — довольно гибкий термин, и то, что здесь написано, не требует 100% универсальной правды. Это просто что-то, что помогает сбалансировать мысли.
Нет, то, что вы написали, не является полиморфизмом. Это связано с тем, что они создают экземпляры разных несвязанных объектов, которые просто реализуют один и тот же интерфейс.
Традиционно полиморфизм возникает, когда у вас есть дочерний объект, который переопределяет реализацию метода родительского объекта. Следовательно, существует «несколько форм» метода, которые существуют одновременно на разных уровнях вертикальной иерархии объекта.
Однако интерфейсы — это просто согласованный контракт на ввод и вывод данных, которые стандартизируют взаимодействия. Они сами по себе не содержат экземпляр кода (мы исключим методы интерфейса по умолчанию ради этого разговора). Из-за этого нет «переопределения» интерфейса внутри объекта. одно и то же дерево объектов не создает несколько версий интерфейса (если только это не осуществляется с помощью традиционного представления полиморфизма).
Даже если методу требуется два аргумента интерфейса ParcelType
, это не обязательно означает полиморфизм, это просто означает, что метод запрашивает два «ящика» определенной формы и размера. Эти поля пусты до тех пор, пока они не будут переданы в метод как два совершенно разных объекта, на которые ссылаются отдельно (а не один и тот же объект метода, переопределяемый дочерним объектом, например)
Различные объекты могут воспользоваться контрактом интерфейса, и в некотором смысле вы можете сказать, что это «горизонтальный полиморфизм», но я думаю, что это отвлекает от понимания того, что означает полиморфизм в контексте Java.
Ответ №3:
Согласно определению W3School, это действительно полиморфизм. В любом случае, если ваши учителя сказали, что это не так, они, возможно, ожидали, что вы сделаете что-то еще.
Полиморфизм — это, если идти дальше, чем просто пример, целая концепция, означающая, что вы можете делать совершенно разные вещи, используя «одни и те же вещи», или, точнее, «вещи с одинаковыми именами».
Взгляните на определение Википедии, которое является более полным, чем любое определение, относящееся к конкретному языку, чтобы иметь более широкое представление о нем.
Ответ №4:
Полиморфизм имеет одно и то же значение в разных формах. Итак, да, это полиморфизм.
Ответ №5:
Я предполагаю, что это resolve
определено в ParcelType
интерфейсе. Затем type.resolve
вызовы в for(ParcelType type : parcels) type.resolve(user)
отправляются полиморфно на ParcelType