Преимущество полиморфизма [закрыто]


когда я начал искать преимущества полиморфизма, я нашел с этим вопросом здесь. Но здесь я не смог найти свой ответ. Позвольте мне сказать, что я хочу найти. Здесь у меня есть несколько классов:

class CoolingMachines{
    public void startMachine(){
        //No implementationion
    }
    public void stopMachine(){
        //No implementationion
    }
}

class Refrigerator extends CoolingMachines{
    public void startMachine(){
        System.out.println("Refrigerator Starts");
    }
    public void stopMachine(){
        System.out.println("Refrigerator Stop");
    }
    public void trip(){
        System.out.println("Refrigerator Trip");
    }
}

class AirConditioner extends CoolingMachines{
    public void startMachine(){
        System.out.println("AC Starts");
    }
    public void stopMachine(){
        System.out.println("AC Stop");
    }
}

public class PolymorphismDemo {
    CoolingMachines cm = new Refrigerator();
    Refrigerator rf = new Refrigerator();
}

теперь здесь я создал два объекта в демо-классе и ссылки на Refrigerator. Я полностью понял это из rf объект я могу назвать trip() метод Refrigerator, но этот метод будет скрыто за

9 69

9 ответов:

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

List<CoolingMachines> coolingMachines = ... // a list of CoolingMachines 
for (CoolingMachine current : coolingMachines) {
    current.start();
}

или когда вы хотите, чтобы метод, чтобы работать с любым подклассом CoolingMachines

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

например, посмотрите на Iterables на гуавы - это много методов, которые (в основном) не заботятся о том, что реализация Iterable используется. Вы действительно хотите, чтобы весь этот код отдельно для каждой реализации?

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

потому что позже, если вы хотите использовать AirConditioner вместо Refrigerator для охлаждения, то только код вам нужно изменить это CoolingMachines cm = new AirConditioner();

причина, по которой вы хотите использовать

CoolingMachines cm = new Refrigerator();

это то, что вы можете позже легко использовать другой CoolingMachines. Вам нужно только изменить эту одну строку кода, и остальная часть кода все равно будет работать (так как он будет использовать только методы CoolingMachines, что является более общим, чем конкретная машина, например Refrigerator).

так что для конкретного экземпляра Refrigerator звонки cm.start(); и rf.start() работать так же, но cm также может быть другой

первый ответ:

используйте полиморфизм для переопределения метода и перегрузки метода. Другие методы класса, используемые в разных классах, затем два варианта: первый метод наследуется, второй метод записывается. Здесь расширьте интерфейс: используйте их, или метод внедрения: логика напишите их. Полиморфизм, используемый для наследования метода, класса.

второй ответ:

есть ли разница между cm.start(); и rf.start();?

да, оба объекта, которые являются совершенно разные по отношению друг к другу. Не создавайте объекты интерфейса, поскольку Java не поддерживает объекты интерфейса. Первый объект создан для интерфейса, а второй-для класса Refrigerator. Второй объект прямо сейчас.

наиболее общий ответ на общий вопрос (почему я должен использовать полиморфизм?) заключается в том, что полиморфизм реализует несколько критических объектно-ориентированных принципов проектирования, например:

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

  • абстракция: Человеческий мозг может только держать трек так много вещей, но они хороши в категориях и иерархиях. Это помогает понять, что происходит в большой программе.

  • инкапсуляция: каждый класс скрывает детали того, что он делает, и просто строится на интерфейсе базового класса.

  • разделение: много объектно-ориентированного программирования связано с распределением обязанностей. Кто будет отвечать за это? Специализированные проблемы могут войти подклассы.

таким образом, полиморфизм является лишь частью большей картины oo, и причины его использования иногда имеют смысл только в том случае, если вы собираетесь попробовать и сделать "реальное" Программирование oo.

простой случай использования полиморфизма заключается в том, что вы можете иметь массив coolingMachines, где элемент 0-это холодильник, а элемент 1-кондиционер и т. д...

вам не нужно предварительно формировать какие-либо проверки или убедиться, с каким объектом Вы имеете дело, чтобы вызвать trip или start и т. д.

Это может быть большим преимуществом при принятии ввода от пользователя и необходимости перебирать все объекты и вызывать аналогичные функции

Я приведу простой для понимания пример. Допустим, у вас есть json

{"a":[1,2],"sz":"text", "v":3, "f":1.2}

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

тогда есть плагины, библиотеки и внешний код с причинами интерфейса.

использование ваших объектов полиморфно также помогает создавать фабрики или семейства связанных классов, что является важной частью how Шаблон Дизайна Фабрики есть. Вот очень простой пример полиморфной фабрики:

public CoolingMachine CreateCoolingMachines(string machineType)
{
    if(machineType == "ref")
        return new Refrigerator();
    //other else ifs to return other types of CoolingMachine family
}

использование вызова выше кода:

CoolingMachine cm = CreateCoolingMachine("AC"); //the cm variable will have a reference to Airconditioner class which is returned by CreateCoolingMachines() method polymorphically

кроме того, представьте, что у вас есть метод, как показано ниже, который использует конкретный параметр класс Refrigerator:

public void UseObject(Refrigerator refObject)
{
    //Implementation to use Refrigerator object only
}

теперь, если вы измените выше реализации UseObject() метод для использования наиболее общего параметра базового класса вызывающий код получит преимущество для передачи любого параметра полиморфно, который затем может быть использован внутри метода UseObject():

public void UseObject(CoolingMachine coolingMachineObject)
{
    //Implementation to use Generic object and all derived objects
}

приведенный выше код теперь более расширяем, так как другие подклассы могут быть добавлены позже в семейство CoolingMachines и объекты этих новых подклассов также будут работать с существующим кодом.