Можно ли это считать полиморфизмом?

#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