следует ли разрешить изменять сигнатуру метода на языке без статической типизации - PullRequest
1 голос
/ 25 октября 2010

гипотетический и академический вопрос.

псевдо-код:

<code><pre><code>
class Book{
 read(theReader)
}

class BookWithMemory extends Book {
  read(theReader, aTimestamp = null)
}

Предполагая, что:

  • интерфейс (если поддерживается) запретил бы его

  • поддерживаются значения по умолчанию для параметров

Примечания:

  • PHP вызывает строгую ошибку стандартов для этого.

Ответы [ 2 ]

0 голосов
/ 26 октября 2010

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

Чтобы избежать неоднозначности, назовите новый метод как-нибудь по-другому (для этого примера, возможно, readAt?) И переопределите read, чтобы вызвать readAt в новом классе. Это делает намерение понятным как для переводчика, так и для любого, кто читает код.


Фактическое поведение в таком случае зависит от языка - более конкретно, оно зависит от того, какая часть сигнатуры составляет селектор метода и как передаются параметры.

Если только имя является селектором (как в PHP или Perl), то все зависит от того, как язык обрабатывает несоответствующие списки параметров метода. Если аргументы по умолчанию обрабатываются на сайте вызова на основе статического типа получателя, а не на точке входа вызываемого, при вызове через ссылку на базовый класс вы получите неопределенное значение аргумента вместо указанного по умолчанию, аналогично что произойдет, если не будет указано значение по умолчанию.

Если количество параметров (с их типами или без них) является частью селектора метода (как в Erlang или E), как это обычно бывает в динамических языках, работающих на JVM или CLR, у вас есть два разных метода. Создайте новую перегрузку, принимая дополнительные аргументы, и переопределите базовый метод тем, который вызывает новую перегрузку со значениями аргументов по умолчанию.

0 голосов
/ 26 октября 2010

Если я правильно читаю вопрос, этот вопрос кажется очень специфичным для языка (поскольку он не применим ко всем динамическим языкам), так как я знаю, что вы можете сделать это в ruby.

class Book
  def read(book)
    puts book
  end
end

class BookWithMemory < Book
  def read(book,aTimeStamp = nil)
    super book
    puts aTimeStamp
  end
end

Я не уверен насчет динамических языков, кроме ruby. Это также кажется довольно субъективным вопросом, так как по крайней мере два языка были разработаны с обеих сторон проблемы (перегрузка метода против: ruby ​​против php).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...