Oop 类型与接口:为什么要键入?

Oop 类型与接口:为什么要键入?,oop,typing,Oop,Typing,通过用javascript拓宽视野,结合我的python经验,我提出了一些想法 如果实体对外部客户机的愿景是通过接口实现的,那么类型的用途是什么 在静态类型化语言中,类型具有非常强的中心重要性。类型和接口是严格关联的。例如,在java中,当您声明一个接口FooIface和一个对象实现该接口时,您不能在需要BarIface的上下文中使用它,即使这两者在方法、签名和异常方面完全相同 python中并非如此。即使两个对象具有完全不同且不相关的类型,只要它们的接口相同,它们也是完全透明的可互换的。如果它

通过用javascript拓宽视野,结合我的python经验,我提出了一些想法

如果实体对外部客户机的愿景是通过接口实现的,那么类型的用途是什么

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

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

这一观点在javascript中发挥到了极致,在javascript中,任何原型链中的每个对象都只是一个对象。您在javascript中询问每个对象的类型,它会告诉您,这是一个对象


在我看来,这些语言的类型概念是徒劳的。那么,什么才是真正重要的呢?类型在动态类型语言中有真正的意义吗?

我不认为它是无用的。考虑:

1) 。当你构造一个对象时

var myThing = new Thing( ... );
事物的类型有意义

2) 。一种事物可以使用的方法

this.aProperty
根据它的类型知识


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

我倾向于将“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
>类型(对象)
>>>X类(对象):
...  通过
... 
>>>类型(X)
>>>类型
>>>类型(X())
>>>类型(X)是类型(类型)
真的

然而,在这种情况下,我通常避免使用“type”这个词。一般来说,我的看法是:“类型”一词意味着所讨论的对象不是一级对象

如果一种语言只考虑类的实现方法来推断它符合哪些接口,那么您可能会意外地实现一个接口。假设在Java中有IA和IB接口,它们都定义了方法longgetRemainingTime。在这种情况下,这些接口的契约将指定它们将返回的格式(一个可以以秒为单位返回时间,另一个以毫秒为单位返回时间)。此外,使用这些接口的上下文也可能非常不同。让我们说它们不是IA和IB,而是IProgress和IStopWatch。在这种情况下,返回的时间将具有非常不同的含义。如果您能够随心所欲地交换这两个接口,可能会得到意想不到的结果


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

这些都是有趣的地方。让我想想,我最终会回来的+顺便说一句,这就是我的意思。两个极端:在Python中,实例的“类型”就是实例本身。在C++中,实例的“类型”是不是程序上可访问的更高级的(我知道有很多方法,这更多的是从哲学的角度来看)。