Существуют ли статически типизированные языки программирования с наследованием, где параметры метода противоречивы? - PullRequest
5 голосов
/ 17 ноября 2011

Теоретически разумно переопределить методы родителя в подклассе с помощью метода, где параметры являются супертипами параметров в родительском классе, например:

class T
  def foo(s: String) = ...

class S
  override def foo(a: Any) = ...

Какие языки программирования поддерживают эту функцию"и как они решают такие проблемы, как возможность того, что один метод подкласса может переопределить несколько методов родительского класса:

class T
  def foo(s: String) = ...
  def foo(i: Int)    = ...

class S
  override def foo(a: Any) = ...

(при условии, что String и Int подтипов Any.)

Ответы [ 2 ]

2 голосов
/ 22 июня 2012

(Неполный ответ) Если мы возьмем пример OCaml, он ответит на заголовок вашего вопроса: это «статически типизированный язык программирования с наследованием, где параметры метода противоречивы».

Что касается второгочасть вашего вопроса («как они решают такие проблемы, как ...»), узел Гордиана разорван, не допуская перегрузки.(Перегрузка означает наличие двух функций с одним и тем же именем, но с разными типами аргументов, что значительно затрудняет вывод типов).

0 голосов
/ 17 ноября 2011

Хотя я понимаю концепции, я не знаю, полностью ли я понимаю ваш вопрос.А именно, звучит так, как будто вы говорите, что производные классы должны иметь возможность реализовывать переопределения методов, которые используют параметры, которые являются «менее» производными.Это кажется мне задом наперед.Кажется, что переопределяющий метод должен иметь возможность использовать только «больше» производных типов.Может быть, это то, что вы имели в виду, или, может быть, я ошибаюсь по этому поводу, но вот цитата того, что C # 4.0 позволяет:

(взято из http://blogs.msdn.com/b/csharpfaq/archive/2010/02/16/covariance-and-contravariance-faq.aspx)

Что такое дисперсия для универсального типаПараметры? Это новая функция в C # 4.0. Теперь, при создании универсального интерфейса, вы можете указать, существует ли неявное преобразование между экземплярами интерфейса, которые имеют аргументы другого типа. Например, вы можете использовать экземпляр интерфейса, который имеет методы сбольше производных типов возвращаемых данных, чем было задано изначально (ковариация) или которые имеют методы с менее производными типами параметров (контравариантность). Те же правила применяются к универсальным делегатам.

...