各语言类型系统之间的区别

C#、ABAP是按照传统的面向对象的思路来设计的。例如interface的成员方法都是显式实现的,好处是一个类可以实现任意多个interface,即使两个interface中有同名方法也没有关系。

Java中interface的实现相对不灵活,因为类的方法名必须与interface中的方法名完全一样。这样,当一个类实现多个接口时,只要其中两个接口拥有同样的方法名,在该类中就只有一个方法能实现这两个接口的方法。无法区分接口,这是一个局限,也是不够OO的地方。

C++不支持interface,但它支持抽象基类以及多重继承(Java和C#都要求单根继承),这样能用抽象类来模拟interface,而抽象类中的方法名又必须出现子类中。因此,它从本质上来说和Java相似。

Go语言用的interface实现方法类似于动态语言的duck typing(it behaves like a duck, so we call it as a duck)。它只要求一个类实现了一个interface的所有方法,但不需要显式声明这个类实现这个接口(这一点在Java、C#中都是必要的)。然后在class到interface类型转换的地方,编译器自动做转换。C#、Java虽然不支持这种形式的转换,但是,也可以通过适配器模式(adapter pattern),用另一个对象显式实现所需的接口,并在适配器类的成员方法中调用原有对象的相应方法。

Python是动态语言,支持duck typing,而不像Go语言,只在转换到interface类型时才用duck typing,而是在运行时每次访问成员(方法或变量)时都用duck typing,即对象的类型完全在运行时确定,随后在动态调用方法时,根据名字去查找方法,然后去调用它。

Javascript和Ruby不仅是动态语言,它们还支持mixin,即把两个类或原型的方法在运行时混合到一起,之后能用来把这些方法作用到对象上。这类似于C# 3.0中的extension method。

返回“编程天地”