5

我是一个经验丰富的业余程序员,我对 C++、D、Java、C# 和其他语言非常熟悉。

除了 Go,几乎所有语言都要求我明确声明我正在实现一个接口。这是荒谬的,因为我们今天有像 Haskell 这样的语言的编译器,它几乎可以用很少的提示进行完整的程序类型推断。

我正在寻找的是一种编程语言,它可以做到这一点:

interface ITest {
    void Test();
}

class Test {
    void Test() { }
}

void main() {
    ITest x;
    x = new Test;
}

哪些语言会看到这一点,并自动标记Test为正在实施ITest

ETA:我不是在寻找鸭子打字。我正在寻找具有推理的严格类型语言。

4

2 回答 2

12

Dwrap在其标准库 Phobos 中有一些东西,可以满足您的需求。这是从函数的 unittest 复制的示例:

interface A {
  int run();
}

interface B {
  int stop();
  @property int status();
}

class X {
  int run() {
    return 1;
  }

  int stop() {
    return 2;
  }

  @property int status() {
    return 3;
  }
}

auto x = new X();

auto ab = x.wrap!(A, B);
A a = ab;
B b = ab;
assert(a.run() == 1);
assert(b.stop() == 2);
assert(b.status == 3);

该工作将从 v2.064 开始提供,并且已经在 git HEAD 上。

于 2013-07-24T18:23:14.600 回答
0

几乎所有的动态语言(javascript、python 等)都支持这种模式。但我猜你对静态验证类型是否满足相关接口的语言感兴趣。

C++

这种支持并不完全是您所要求的,因为您不会ITest直接使用。相反,您将使用一个模板来简单地访问所需的类型成员

// C# style solution 
void UseIt(ITest p) { 
  p.Test();
}

// C++ style solution
template <typename T>
void UseIt(T p) { 
  p.Test();
}

C++UseIt方法适用于任何具有可访问成员的类型Test。这里不需要接口

class C1 { 
public: 
  void Test() { }
}

class C2 { } 

UseIt<C1>(C1());  // Ok
UseIt<C2>(C2());  // Error! 

打字稿

Typescript 直接实现了您描述的模式。归根结底,打字稿只是 javascript 的一个薄包装器,因此是动态的。但它确实提供了编译时类型注释。它对接口的支持与您在问题中描述的模式完全匹配

F#

F# 通过对内联声明的成员约束具有与 C++ 类似的支持

let inline UseIt<^T when ^T : (member Test: unit -> unit)> s = ...
于 2013-07-24T16:38:21.687 回答