类型与界面:为什么打字呢?

时间:2010-01-08 07:35:29

标签: oop typing

通过使用javascript和我的python经验拓宽视野,我想了一下。

如果实体对外部客户的愿景是通过其界面,那么输入的目的是什么?

在静态类型语言中,类型具有非常强大的核心重要性。类型和接口严格关联。例如,在java中声明接口FooIface并且对象实现该接口时,不能在需要BarIface的上下文中使用它,即使两者在方法,签名和异常方面完全相同。

在python中不是这样。即使两个对象具有完全不同且不相关的类型,只要它们的接口相同,它们就可以完全透明地互换。如果它嘎嘎叫,像鸭子一样走路,它就是一只鸭子。我可以通过在运行时完全改变它的接口来完全改变对象的性质,但它将保留原始类型。

这种观点在javascript中被置于极端,其中任何原型链中的每个对象都只是一个对象。你问javascript中每个对象的类型,它会告诉你,它是一个对象。

在我看来,这些语言的类型概念是徒劳的。什么是非常重要的?类型在动态类型语言中是否具有实际意义?

3 个答案:

答案 0 :(得分:1)

我看不出徒劳。考虑:

1)。构造对象时

var myThing = new Thing( ... );

Thing的类型具有重要意义。

2)。 Thing的方法可以使用

this.aProperty

根据其类型知识

3)。您可以使用instanceof来确定类型

答案 1 :(得分:1)

我倾向于将“type”这个词理解为与Python中的“class”相同。这只有99%正确,但足够接近。

>>> type(object)
<type 'type'>
>>> class X(object):
...  pass
... 
>>> type(X)
<type 'type'>
>>> type(_)
<type 'type'>
>>> type(X())
<class '__main__.X'>
>>> type(X) is type(type)
True
但是,我确实在这种情况下通常避免使用“类型”一词。一般来说,我看待它的方式是:“类型”一词意味着所讨论的东西不是一流的对象。

答案 2 :(得分:1)

如果某种语言仅考虑类的实现方法来推断它符合哪种接口,则可以意外地实现接口。让我们说在Java中你有接口 IA IB ,它们都定义了方法 long getRemainingTime 。在这种情况下,这些接口的契约将指定它们将返回什么样的格式(一个可以以秒为单位返回时间,而另一个以毫秒返回时间)。使用这些接口的上下文也可能非常不同。可以说它们不是名为 IA IB ,而是 IProgress IStopWatch 。在这种情况下,返回的时间将具有非常不同的含义。如果你能够按照自己喜欢的方式交换这两个接口,那么你可能会得到意想不到的结果。

通常,类型可以被视为执行基本静态代码分析的辅助手段。如果您实现了一个特定的接口,那么编译器可以直接告诉您,您可能犯了一个错误,如果您尝试将实现的实例传递给期望类似实现但类型不同的方法。