【问题标题】:type vs. interface: why typing then?类型与界面:为什么要打字呢?
【发布时间】:2010-01-08 07:35:28
【问题描述】:

通过使用 javascript 拓宽我的视野以及我的 python 经验,我提出了一些想法。

如果一个实体对外部客户的视觉是通过它的接口,那么类型的目的是什么?

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

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

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

在我看来,这些语言的类型概念已经到了无用的极限。那么真正重要的是什么?类型在动态类型语言中有真正的意义吗?

【问题讨论】:

    标签: oop typing


    【解决方案1】:

    我不认为徒劳。考虑:

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

    var myThing = new Thing( ... );
    

    Thing 的类型具有重要意义。

    2)。 Thing 可以使用的方法

    this.aProperty
    

    根据其对类型的了解

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

    【讨论】:

    • 这些是有趣的点。让我考虑一下,我最终会回来的。 +1 顺便说一句。
    【解决方案2】:

    我倾向于将“类型”一词理解为 Python 中的“类”一词。这只有 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
    

    不过,在这种情况下,我通常会避免使用“类型”一词。总的来说,我的看法是这样的:“类型”这个词意味着所讨论的事物不是一流的对象。

    【讨论】:

    • 这就是我的意思。两个极端:在 Python 中,实例的“类型”就是实例本身。在 C++ 中,实例的“类型”是某种无法以编程方式访问的高级存在 [我知道有办法;这更多是从哲学的角度来看]。
    【解决方案3】:

    如果一种语言只考虑一个类的实现方法来推断它符合哪些接口,你可能会意外地实现一个接口。假设在 Java 中,您有接口 IAIB,它们都定义了方法 long getRemainingTime。在这种情况下,这些接口的合约将指定它们将返回哪种格式(一个可以以秒为单位返回时间,而另一个以毫秒为单位返回时间)。此外,使用这些接口的上下文可能非常不同。假设它们不称为 IAIB,而是 IProgressIStopWatch。在这种情况下,返回的时间将具有非常不同的含义。如果您能够随意互换这两个接口,您可能会得到真正意想不到的结果。

    一般来说,类型可以被视为执行基本的静态代码分析的辅助工具。如果你实现了一个特定的接口,编译器可以直接告诉你你可能犯了一个错误,如果你试图将你的实现实例传递给一个期望类似实现但类型不同的方法。

    【讨论】:

      猜你喜欢
      • 2014-02-12
      • 2021-05-16
      • 1970-01-01
      • 2022-06-23
      • 1970-01-01
      • 2021-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多