answer: ** Этот веб-сайт против использования операторов if для ** проверки наличия у объекта определенного типа. Это полностью отличается от if (foo == 5)
. Плохо использовать if как if (foo instanceof pickle)
Альтернатива, использующая вместо этого полиморфизм, способствует инкапсуляции, бесконечно облегчая отладку, сопровождение и расширение кода.
Быть против if
в целом (выполнение определенной вещи, основанной на условии) ничего не даст вам. Обратите внимание, как все остальные ответы здесь все еще принимают решения, так в чем же разница?
объяснение причины полиморхишма:
Возьмите эту ситуацию:
void draw(Shape s) {
if (s instanceof Rectangle)
//treat s as rectangle
if (s instanceof Circle)
//treat s as circle
}
Намного лучше, если вам не нужно беспокоиться о конкретном типе объекта, обобщая, как объекты являются процессами.
void draw(Shape s) {
s.draw();
}
Это перемещает логику того, как нарисовать фигуру в самом классе фигуры, поэтому теперь мы можем обрабатывать все фигуры одинаково. Таким образом, если мы хотим добавить новый тип фигуры, все, что нам нужно сделать, это написать класс и дать ему метод draw вместо изменения каждого условного списка во всей программе.
Эта идея сегодня встречается повсеместно в программировании, вся концепция интерфейсов полностью связана с полиморфизмом. (Shape - это интерфейс, определяющий определенное поведение, позволяющий нам обрабатывать любой тип, который реализует интерфейс Shape в нашем методе.) Динамические языки программирования продвигаются дальше, позволяя нам передавать в метод любой тип, который поддерживает необходимые действия. Что выглядит лучше для вас: (псевдокод в стиле Python)
def multiply(a,b):
if (a is string and b is int):
//repeat a b times.
if (a is int and b is int):
//multiply a and b
или используя полиморфизм:
def multiply(a,b):
return a*b
Теперь вы можете использовать любые 2 типа, которые поддерживают оператор *, что позволяет использовать метод с типами, которые еще не были созданы.
См. полиморфизм , что такое полиморфизм в стеке потока