полиморфизм, сложно звучащее слово, которое просто означает наличие множества форм. И, что вполне уместно, существует множество форм полиморфизма. Одна форма, называемая динамическим или динамическим полиморфизмом, позволяет нам получать доступ к методам, используя один и тот же интерфейс для различных типов объектов, которые могут реализовывать эти методы по-разному.

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

Я немного жду, пока он заварится, и на выходе получается свежая чашка горячего кофе.

Вы можете использовать другой тип кофеварки. Французская пресса. у френч-пресса также есть метод заваривания с точно такими же входами и выходами, как и у обычной кофеварки. Я ввожу мерную ложку молотого кофе и немного воды. Затем через некоторое время я нажимаю на поршень, и на выходе получается свежая чашка горячего кофе.

Теперь, хотя эти две кофеварки имеют одинаковые входы и выходы, способ заваривания у них очень разный. В кофеварке Basic используется фильтр, тогда как во френч-прессе кофе процеживается через металлическое сито. — И хотя полученные выходы — это однотипные объекты, чашка кофе, их атрибуты могут иметь несколько разные значения.

когда дело доходит до фактической реализации этого типа полиморфизма в коде, это можно сделать несколькими способами. FrenchPress может наследовать все атрибуты и методы моего BasicCoffeeMaker. Но затем он заменяет метод заваривания, унаследованный от BasicCoffeeMaker, посредством процесса, называемого переопределением.

Это позволяет FrenchPress пересмотреть свою собственную уникальную версию метода заваривания.

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

Я реализовал его с помощью интерфейса в java.
CoffeeMaker.java

public interface CoffeeMaker {
    String brewCoffee(String water, String groundedCoffee);
}

моя базовая кофеварка наследует интерфейс coffeeMaker

public class BasicCoffeeMaker implements CoffeeMaker {

    @Override
    public String brewCoffee(String water, String groundedCoffee) {
        System.out.println("mixing water and grounded coffee, you coffee will be ready in  1 minutes ");
        return "A cup of coffee";
    }
}

мой FrenchPress также наследуется от coffeeMaker, но реализует заваривание по-другому, но в результате они оба возвращают чашку кофе

public class FrenchPress implements CoffeeMaker{

    @Override
    public String brewCoffee(String water, String groundedCoffee) {
        System.out.println("add water, add grounded coffee," +
                " put the presser on and close the lead and wait for a 1 minutes");
        System.out.println("press and pure you cup of coffee");
        return "a cup of coffee";
    }
}

Другая распространенная форма полиморфизма называется статическим полиморфизмом или полиморфизмом времени компиляции. И он использует функцию многих объектно-ориентированных языков программирования, называемую перегрузкой методов, которую не следует путать с переопределением методов. Перегрузка позволяет реализовать в классе несколько методов с одинаковым именем, но с другим набором входных параметров. Если я дам в качестве входных аргументов метод заваривания френч-пресса, кофе и воду, то получу обратно чашку кофе. Но если я изменю тип ввода с кофе и воды на чайные листья и воду, это будет другой набор параметров, поэтому френч-пресс выполнит другую версию метода заваривания, которая вернет мне чашку горячего чая. Заваривание с кофе и водой и заваривание с чаем и водой — это два разных метода с двумя разными сигнатурами. И FrenchPress автоматически выполнит соответствующий запрос в зависимости от того, что вы ему дадите. У вас также могут быть варианты метода с разным количеством входных параметров. Я мог бы реализовать версию метода заваривания, которая принимает три входа: кофе, чай и воду. — Ты мог бы сделать это, но я не уверен, что ты захочешь пить то, что получится. В большинстве случаев эти перегруженные методы будут предоставлять разные, но очень похожие функции. Итак, это разные формы полиморфизма. Определение разных классов, которые можно использовать с одним и тем же интерфейсом. — Или перегрузить метод из того же класса, который может принимать разные наборы параметров.

это пример перегрузки метода с FrenchPress

public class FrenchPress{

   
    public String brew(String water, String groundedCoffee) {
        System.out.println("add water, add grounded coffee," +
                " put the presser on and close the lead and wait for a 1 minutes");
        System.out.println("press and pure you cup of coffee");
        return "a cup of coffee";
    }
    public  String brew(String water, String tea, String lime){
        return "this is a mixture of water tea and lime";
    }
}