6

オブジェクトを内部的にハッシュテーブル(JavaScriptなど)として処理する言語を学びたいと思いますが、オブジェクトを強力な型でラップして、設計時にコード補完/インテリセンスの利点を提供することができます。これが私がこの夢の言語が機能することを望む方法です:

public class Lion
{
  public void Roar() { Console.WriteLine("Aaarrgghh");}
} 

public static Main(string[] args)
{
  object myCat = new object(); // just plain object, no type!
  // adding a Roar() method to the myCat instance 
  myCat.Roar += delegate() {Console.WriteLine("Miauew");}
  // At this point myCat should qualify to be a Lion.
  // So we should be able to successfully duck-type-cast 
  // her to a lion
  Lion myLion = myCat as Lion;
  // now the myLion reference is strongly typed, 
  // so I expect the Intellisense window pop up 
  // and offer me the Roar() method when I hit the dot after "myLion"
  myLion.Roar();
}

このプログラムがエラーなしでコンパイルされ、例外なく実行 され、コンソールに「Miauew」と出力されることを望みます。これを行うことができる言語はありますか?多分C#4.0?

4

5 に答える 5

3

たぶん、C#4.0の新しい動的タイプです。これを見てください:http://blogs.msdn.com/cburrows/archive/2008/10/27/c-dynamic.aspx

于 2009-06-28T13:38:45.943 に答える
2

それはむしろ、Lionタイプに非仮想メソッドを実装させることによって意図したものに依存します。

拡張タイピング(特定のタイプのオブジェクトのセットは、そのタイプのプロパティを持つオブジェクトであり、ダックタイピングの静的な同等物に近い)では、オブジェクトの構造がそのタイプを意味する必要がありますが、Lionタイプには構造がありません-それはライオンであるものはすべてその特定の咆哮の方法を持っていると言うだけです。ですから、あなたの例では、あなたがライオンに持っているとあなたが言った唯一の構造的特性を持っていないので、あなたがあなたの猫をライオンにキャストする方法を私は見ることができません。

一方、あなたが言うことはライオンであると言うことを意図した場合、それは独自のRoarメソッドを持っているか、ライオンのメソッドを使用する可能性があります、それはライオンであるオブジェクトのタイプについて何も言っていません、そしてあなたが得ることができるAFAIKオブジェクトの拡張メソッドと同じ動作です(ただし、自己メソッドがC#の拡張メソッドをオーバーライドするかどうかを知るのに十分なC#はわかりません)。

動的IDEでは、IDEがmyCatにRoarプロパティがあることを確認する前に、Lionにキャストする必要がある理由はありません。その情報は静的に推論可能です。

JavaScriptなどの動的に構築された型を持つ言語でIDEのサポートが難しい理由は、次のことができるためです。

let myCat = {}

if ( locale.name == 'en' )
    myCat.roar = function () { alert ( "Miauew" ); }
else
    mCat[ resources.getString( 'roar' ) ] = 
        function () { alert ( resources.getString ( 'Miauew' ) ); }


// the structure of the type of myCat depends what locale the code
// is running in, so you can't deduce the Intellisense
myCat.

もちろん、このような状況は、より詳細な分析(たとえば、フランスの猫が常にフランス語で咆哮するように求められていることを確認するなど)がなければ、コードが機能するかどうかを予測できないことを意味します。

Intellisenseが静的に推論可能な構造を持つオブジェクトの構造を推測できない場合、それは動的型付けではなく、Intellisenseの弱点です。

あなたの例で強い型付けの利点は何だと思いますか?

于 2009-06-28T13:59:06.667 に答える
2

私がそのようなことを計画しようとするたびに、問題はキャストです。もちろん、プログラマーの言葉をそのまま受け入れることもできますが、それは両方のタイピングシステムの最悪の機能を組み合わせたものです。キャストは実行時にオブジェクトがLionインターフェースを実装しているかどうかをチェックできるかもしれませんが、それは基本的に不可能です。この場合、必要なのはvoid (*)()関数の存在だけなので、それはもっともらしいように見えます。しかし、一般的に、LionにgetHabitat、別のインターフェースであると想定されるオブジェクトを返すメソッドがある場合はどうなるでしょうか。強く型付けされた言語は、実際にそうなることを確実に言うことができる必要がありますが、実際にメソッドを呼び出さないと、一般に、型付けされていないコードが生息地を返すかどうかを判断できません。したがって、強い型付けの用語では、作業できません。それがライオンかどうかを調べます。

したがって、コードの弱い型と強い型のセクションを混在させると、いつでもメソッドを呼び出してインターフェイスを実装していないオブジェクトを取り戻す可能性のある強い型のコードになってしまうという問題を乗り越えたことはありません。することになっています。これは強い型付けではなく、誤解を招くコードコメントを伴う動的型付けです。

于 2009-06-28T14:00:00.753 に答える
1

これは興味深いアイデアであり、以前に検討されたものです。私の考えを述べた後、いくつかの研究と既存の仕事にリンクします。これはあなたが話していることだと思うので、スクリプト言語と静的命令型言語について話します。

根本的な問題は、型が静的型システムと動的型システムで同じものを意味しないことです。動的システムでは、型は値のプロパティであり、値が渡されると型も渡されます。静的システムでは、変数 (など) が保持できる値の型を制限します。ここまでは順調ですね。

動的言語の静的型

スクリプト言語でオブジェクトがどのように使用されているかを見ると、問題が発生します。それらはすべてダックタイプです。これは、タイプの名前 ( Nominal-typing ) が役に立たないことを意味します。最新の命令型言語 (Java、C#、C++、C) はすべて、名義型システムを使用します。したがって、C++ では を期待すると言うかもしれませんDuckが、Python では実際には が必要ですquack()

したがって、ダック型言語に静的型付けを追加することを検討してください。関数はパラメータをに期待しますが、 をquack()期待しているとは言えないためDuck、この 2 つを組み合わせるのは困難です。quackswhich canというインターフェイスを定義し、quack()それを型として使用することができます。しかし、これは実際には少し冗長であり、動的型付けの利点が失われます。おそらく、これらの線に沿って、それを実行できる何か (ある種の構造型システム) があるかもしれません。

別の方法は、プログラマーに を指定するように要求するだけで、Duckとにかくこのダックタイピングビジネスをくそくらえにすることです-誰も実際にそれを使用していませんか? しかし、それでは Python で Java を書いているだけで、一度それを試みた者として、非常に非生産的であると言わせてください。

静的言語の動的型

では、逆に見てみましょう。dynamicC# はこのキーワードからどのように利益を得ますか? 簡単な答えは、そうではないということです。正直なところ、C# で Python から得られる美しさと自由は見当たりませんdynamic。これについて私が知っているのは、Jon Skeet の講演から得たものだけですが、私が受けた圧倒的な印象は、冗長で洗練されていないということです。そして、それは C# の人々の実装エラーではないと思います。dynamicそれは、動的型付けが Python で解決する問題が C# で既に解決されており (冗長ではありますが)、パーティーに何ももたらさないからだと思います。

静的・動的なものの研究

Jeremy Siek の段階的な型付けに関する記事を調べてください。これは、最も高度な静的/動的研究に関するものです。少し読みにくいですが、ざっと見ただけなので、要約することはできません。しかし、彼の関連作品だけをパラパラとめくってみるのも面白いですし、STOP カンファレンスには良いものが含まれているでしょう。

于 2009-09-02T14:04:52.870 に答える
0

あなたの例とは密接に関連していませんが、Scalaの暗黙の変換は、完全に制御され、静的にチェックされた方法でクラスの機能を拡張するためのよく考えられた(従うのが難しい場合もあります)メカニズムです。

また、タイプセーフな方法でダックタイピングの代わりとして役立つことがある構造型タイピングもあります。

于 2011-08-12T23:33:52.747 に答える