Переопределение метода может быть предотвращено при помощи ключевого слова final
, аналогично, как предотвратить перегрузку?
Вы не можете сделать это в Java.
Перегруженный метод - это, по сути, просто еще один метод.
Попытка может выглядеть (что-то) вроде этого
void yourMethod(String arg) { /* ... */ }
void yourMethod(String arg, Object... prevent) {
throw new IllegalArgumentException();
}
но она не сработает, поскольку Java разрешает перегрузку, рассматривая "наилучшее соответствие" или "наиболее специфическую сигнатуру".
Метод все еще может быть перегружен с помощью a
void yourMethod(String arg, String arg2) { /* ... */ }
который будет вызываться при выполнении yourMethod("hello", "world")
.
Кстати, почему вы хотите предотвратить перегрузку? Возможно, есть другой способ сделать то, что вы хотите?
Эээ ... какой смысл не разрешать перегрузку метода?
Защита от переопределения разрешена, потому что это может быть сделано другим программистом, который предположительно работает над другой частью кода и его класс унаследован от вашего класса.
Перегрузка выполняется в том же классе и логически предполагается, что она должна выполняться программистом, который знает этот код и работает над той же частью кода. Итак, если он знает этот код (теоретически) и есть некоторая неотъемлемая опасность при перегрузке, то он должен знать это уже, потому что он знает код.
Тем не менее, перегрузку нельзя остановить, как уже писали другие.
Вы можете предотвратить перезапись метода , сделав его окончательным, но вы не можете предотвратить перегрузку метода . Технически вы можете сделать класс окончательным, чтобы никакие методы не могли быть добавлены путем создания подкласса, но я не думаю, что это хороший дизайн.
Если вы перегружаете метод, вы создали метод с тем же именем, но с разными типами параметров. В Java метод определяется (частично) в терминах своих параметров, и, таким образом, если два метода имеют одно и то же имя, но разные параметры, то они являются яблоками и апельсинами, то есть не одинаковы. Короче говоря, вы не можете помешать кому-либо создавать новые методы в классе, что, по сути, именно то, о чем вы просите.
Вы не можете. Потому что это почти бессмысленно.
Если вы хотите перегрузить метод handle(...)
, но вам это запрещено, то вместо него вы создадите doHandle(...)
.
Какой перегруженный метод будет использоваться, определяется во время компиляции (в отличие от переопределенных методов, которые определяются во время выполнения). Таким образом, смысл перегрузки заключается в использовании общего имени для общих операций. Запрет на это - скорее вопрос стиля кода, чем что-то еще.
Переопределение и перегрузка - это разные методы. Перегрузка - это способ объявления нескольких методов с одинаковыми именами, но с разными типами параметров или разным количеством параметров.
Пометить класс final, и он не может быть расширен. Однако это может нарушить некоторые другие цели.