其他哪些语言支持Go';s没有明确声明的接口风格

本文关键字:声明 风格 接口 语言 支持 Go 其他 | 更新日期: 2023-09-27 18:24:40

我是一个经验丰富的业余程序员,对C++、D、Java、C#等都很熟悉。

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

我正在寻找的是一种能做到这一点的编程语言:

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

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

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

其他哪些语言支持Go';s没有明确声明的接口风格

D在其标准库Phobos中有一种名为wrap的东西,它可以做您想要的事情。下面是从函数的单元测试中复制的一个示例:

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上了。

实际上,任何动态语言(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

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

  • http://blogs.msdn.com/b/typescript/archive/2013/01/24/interfaces-walkthrough.aspx

F#

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

let inline UseIt<^T when ^T : (member Test: unit -> unit)> s = ...