Есть ли какие-нибудь статичные языки типа утка? - PullRequest
17 голосов
/ 14 ноября 2008

Могу ли я указать интерфейсы при объявлении участника?

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

public interface IMyInterface
{
  public void MyMethod();
}

public class MyClass  //Does not explicitly implement IMyInterface
{
  public void MyMethod()  //But contains a compatible method definition
  {
    Console.WriteLine("Hello, world!");
  }
}

...

public void CallMyMethod(IMyInterface m)
{
  m.MyMethod();
}

...

MyClass obj = new MyClass();
CallMyMethod(obj);     // Automatically recognize that MyClass "fits" 
                       // MyInterface, and force a type-cast.

Знаете ли вы какие-либо языки, которые поддерживают такую ​​функцию? Будет ли это полезно в Java или C #? Это в какой-то мере в корне неверно? Я понимаю, что вы можете создать подкласс MyClass и реализовать интерфейс или использовать шаблон проектирования адаптера для достижения той же цели, но эти подходы кажутся ненужным стандартным кодом.

Ответы [ 15 ]

1 голос
/ 01 июня 2016

Кристалл - язык статической утки. Пример :

def add(x, y)
  x + y
end

add(true, false)

Вызов add вызывает эту ошибку компиляции:

Error in foo.cr:6: instantiating 'add(Bool, Bool)'

add(true, false)
^~~

in foo.cr:2: undefined method '+' for Bool

  x + y
    ^
1 голос
/ 15 апреля 2014

D (http://dlang.org) - это статически скомпилированный язык, обеспечивающий типизацию при помощи утки через wrap () и unwrap () (http://dlang.org/phobos-prerelease/std_typecons.html#.unwrap).

1 голос
/ 14 ноября 2008

В предварительном выпуске Visual Basic 9 поддерживалась статическая типизация утки с использованием динамических интерфейсов, но они сократили функцию * для своевременной отправки.

0 голосов
/ 22 декабря 2009

В последней версии моего языка программирования Heron он поддерживает нечто подобное через оператор приведения структурного подтипа, называемый as. Так что вместо:

MyClass obj = new MyClass();
CallMyMethod(obj);

Вы бы написали:

MyClass obj = new MyClass();
CallMyMethod(obj as IMyInterface);

Как и в вашем примере, в этом случае MyClass не обязательно должен явно реализовывать IMyInterface, но если это произойдет, приведение может произойти неявно и оператор as может быть опущен.

Я написал немного больше о технике, которую я называю явной структурной подтипом в этой статье .

0 голосов
/ 29 декабря 2008
...