Почему допустимо следующее:
public class Foo {
public Foo() { ... }
public void Foo() { ... }
}
Есть ли веская причина для именования метода так же, как класс?
Почему допустимо следующее:
public class Foo {
public Foo() { ... }
public void Foo() { ... }
}
Есть ли веская причина для именования метода так же, как класс?
Моя догадка заключается в том, что это разрешено, потому что явно запрет на это добавит еще одно требование к правилам именования идентификаторов Java для очень небольшой выгоды. В отличие от, например, С++, Java всегда требует, чтобы конструкторы вызывались с ключевым словом new
, поэтому нет никакой двусмысленности в отношении того, относится ли идентификатор к методу или конструктору. Я согласен с тем, что метод с тем же именем, что и его родительский класс, с первого взгляда довольно запутан, и его почти наверняка следует избегать. Тем не менее, я рад, что они решили не усложнять язык, запретив такие методы.
Это отвратительно. Я бы не позволил такой вещи пережить обзор кода.
Единственная действительная причина, о которой я могу думать - для использования этого - если родительский класс добавляет методы после того, как вы написали дочерний класс:
interface Father { } // version 1.0
class Son implements Father { Son ( ) { } } // version 1.0
interface Father { void Son ( ) ; /* new method */ } // version 2.0
class Son implements Father { Son ( ) { } void Son ( ) { } } // version 2.0
Если вы не контролируете интерфейс Father
, но имеете контроль над классом Son
, вам нужно как-то изменить Son
. Вы могли
Son
Father
Son
Если класс Son
является зависимостью от многих других проектов, то # 1 и # 2 могут быть неприемлемыми, оставляя вас без выбора, кроме как добавить метод Son( )
.
Это очень надуманный пример. Вы никогда не должны видеть такое в реальном коде.
Конструктор имеет то же имя, что и класс, и попадает под пространство имен типов. Пространство имен методов отличается от пространства имен типов в Java. Так что это технически разрешено (и это не перегрузка).
Однако нет никакой реальной причины фактически называть метод таким же, как имя класса. Это будет считаться очень плохой практикой.
Я не вижу в этом веской причины.
С# предоставляет ошибку компилятора - "Имена членов не могут совпадать с их типом размещения"
Это может быть довольно запутанным, особенно при использовании отражения, чтобы посмотреть на состав объекта.
Возвращаемое значение метода определяется как void, тогда как конструктор не имеет возвращаемого значения, что делает их разными и, следовательно, действительными. Почему кто-то хотел бы это сделать, однако, находится вне меня.
причина в том, что в конструкторах мы передаем значения во время создания объекта класса. Так что имя конструктора должно быть таким же, чтобы оно могло принимать переданные значения и инициализироваться во время создание объекта класса.