4

Python の経験と合わせて JavaScript を使用して視野を広げることで、いくつかのことを考えました。

外部クライアントへのエンティティのビジョンがそのインターフェイスを介している場合、タイプの目的は何ですか?

静的型付き言語では、型は非常に強力で中心的な重要性を持っています。タイプとインターフェースは厳密に関連付けられています。たとえば、Java でインターフェイス FooIface を宣言し、そのインターフェイスを実装するオブジェクトを宣言すると、BarIface を必要とするコンテキストでは、2 つのメソッド、シグネチャ、および例外がまったく同じであっても、それを使用することはできません。

Python ではそうではありません。2 つのオブジェクトの型がまったく異なり、関連性がない場合でも、それらのインターフェイスが同じである限り、それらは完全かつ透過的に交換可能です。アヒルのように鳴いて歩くなら、それはアヒルです。実行時にインターフェイスを完全に変更することで、オブジェクトの性質を完全に変更できますが、元の型は保持されます。

この観点は、あらゆるプロトタイプ チェーン内のすべてのオブジェクトがまさにオブジェクトである Javascript では極端になっています。JavaScript で各オブジェクトのタイプを尋ねると、それがオブジェクトであることがわかります。

私には、これらの言語の型の概念が無益の限界に達しているように見えます。では、何が本当に重要なのでしょうか? 型は動的型付け言語で本当の意味を持っていますか?

4

3 に答える 3

1

言語がクラスの実装されたメソッドのみを考慮して、どのインターフェイスに準拠しているかを推測する場合、誤ってインターフェイスを実装する可能性があります。Javaで、メソッドlonggetRemainingTimeを定義するインターフェースIAIBがあるとします。この場合、これらのインターフェースのコントラクトは、どのような形式を返すかを指定します(1つは秒単位で時間を返し、もう1つはミリ秒単位で時間を返します)。また、これらのインターフェイスが使用されるコンテキストは大きく異なる場合があります。それらはIAIBではなく、IProgressIStopWatchと呼ばれているとしましょう。 。このような場合、返される時間の意味は大きく異なります。これらの2つのインターフェースを好きなように交換できた場合、予期しない結果が生じる可能性があります。

一般に、このタイプは、基本的な静的コード分析を実行するための補助と見なすことができます。特定のインターフェースを実装する場合、同様の実装を期待しているが異なるタイプのメソッドに実装のインスタンスを渡そうとすると、コンパイラーはおそらく間違いを犯していることを直接通知できます。

于 2010-01-08T10:55:04.443 に答える
1

私には無駄が見えません。検討:

1)。オブジェクトを構築するとき

var myThing = new Thing( ... );

モノのタイプには意味があります。

2)。使えるモノの方法

this.aProperty

タイプの知識によると

3)。instanceof を使用してタイプを判別できます

于 2010-01-08T07:49:49.050 に答える
1

私は「タイプ」という言葉を 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

ただし、この場合、通常は「タイプ」という言葉を避けます。一般的に、私の見方は次のとおりです。「タイプ」という言葉は、問題のものがファーストクラスのオブジェクトではないことを意味します。

于 2010-01-08T07:52:23.053 に答える