..


スポンサーリンク

多型とRubyのダックタイピング

アレッシオSaltariniによって書かれた記事
ページ1の2

実行時の動作を生成するために、変更されずに残っている間多型は、ソースコードの一部の使用を可能にするプログラミング手法です。

ポリモーフィックなコードを作成すると、オブジェクト指向プログラミングで特定の意味があります:それはインターフェイスを実装するすべてのクラスの分類を作成することを意味します。

例えば、私のインターフェースは"getArea"メソッドを定義する、のであれば、このインタフェースを実装する各クラスは、メソッド"getAreaを"必要があります:これは、私たちは、そのアルゴリズムの実行を変更できるメソッドをポリモーフィックなメソッドを書くことができます引数として渡されるオブジェクトの種類に応じて。

伝統的なOOP言語で多型

Javaで - しかし、同じことがCのために+ +やその他の言語、オブジェクト指向(OO)が完成、我々はその後、Rubyのケースをお渡しされる真である - 例えば:






インタフェースIFormaGeometrica







 {



   



ボイドgetArea();







 }









パブリッククラスのトライアングルはIFormaGeometricaを実装しています







 {



 



 @オーバーライド



 



公共int型getArea()



 



 {



  



戻る(* this.base this.altezza)/ 2;



 



 }







 }



このケースでは、"is"がすべてのオブジェクトがFormaGeometrica getAreaメソッド持っていることを示すinterface IFormaGeometrica define -このような三角形のクラスなど、FormaGeometrica is、私たちはプログラムを書くことができるgetAreaの独自の実装があり、それは今のコードに存在し、その元のソースコードを変更することなく、将来的に実装されるかどうか、任意の幾何学的形状の面積を計算することができる。

実際に、私はクラスの電卓を作成するとします。






公共の最後のクラスの電卓







 {





 



公共の静的な無効メイン(文字列[] args)



 



 {



  



コレクションのフォーム<IFormaGeometrica> =



          



 <IFormaGeometrica>新しいArrayList();





  



 forme.add(新しいトライアングル());



  



 forme.add(新しいスクエア());



  



 forme.add(新しいペンタゴン());





  



 (:フォームIFormaGeometrica g)を用



  



 {



   



 system.out.printlnを(g.calcolaArea());



  



 }



 



 }







 }



これは、コレクション内の各オブジェクトがインタフェースIFormaGeometricaを実装する必要がある限り、入力としての幾何学的形状の任意のコレクションを取ることができるそしてそれは本質的にメソッドgetAreaを持っいます Javaでのこの例では、純粋に学問的である:実際には、おそらく、各クラスのコンストラクタで、我々は、入力の幾何形状の辺の対策、傾斜などが含まれます。

目標が達成されます:我々は、ビデオに任意の幾何学的形状の領域を印刷できるクラスを書いた。 私は繰り返し:これはすでに、将来的に実装されている、(三角形の場合のように)実装されているコードです。

だけではなく:トライアングルエリアの計算の実装はバグが含まれている場合、私はクラストライアングルの電卓を書き直すことなくクラスを変更することができます 多分それはすべての変更を再起動する必要があるサーバにデプロイされました:この場合、コードを変更する必要がないため、大きな利点です。 すべての変更が潜在的なバグをもたらすので、しかし、それ以外の、それは常に"変化"そのコードの一部を制限することが有利である。 逆に、それは常に変更されないままのコードの部分に確実に知ることは、よいプログラミング手法です。

何が"裏で"起こることは、コンパイラはクラスの電卓mainメソッドのポリモーフィックコード内のすべてのオブジェクトがインターフェイスを実装しているのを確認することがあります。 このように、彼らは契約による設計の方法論を用いて表現であると言う、"契約は尊敬です。"

そうでない場合、それが"フォーム"にある場合は、我々はIFormaGeometricaコンパイル時にエラーが実装されていないというクラスのオブジェクトを持っているまたはコンパイラがエラーを通知しまうため、プログラムを実行するために管理していません。

Rubyで多型

しかし、Rubyでどうなりますか? とコンパイルされたが、言語を解釈する、ポリモーフィックなメソッドを書いていないルビー、の"可能性?

はい、それ確かに可能ですが、オブジェクト指向言語よりも"哲学的"とコンパイルされた深遠な違いは、どの

我々はそれを記述することができる。 オブジェクトは、オブジェクトの特定のタイプに属することを確立するためにJavaと古典的でオブジェクト指向プログラミングは、(特定のインタフェースを実装する)明示的に親クラスから派生するオブジェクトする必要があります:基本的には、継承の技法(継承を使用する必要がありますクラス、抽象クラスまたはインタフェースによって)。

それが言うようになる:これは私の前のアヒルであるかどうかを判断するために、私はそれがアヒルになるかどうかを確認するために実験室で彼のDNAと勉強してください。

Rubyでは、あなたはジェームズライリー(参照によって発明された"アヒルのテストを"(アヒルのテスト)を使用しているhttp://en.wikipedia.org/wiki/Duck_typing~~V ):

それがアヒルのように歩くとアヒルのように鳴くなら、それはアヒルである。

(ちなみに彼はアヒルを見るとき私達のそれぞれを作るものである)。

これはどういう意味ですか? それはつまり、Rubyで、より一般的にオブジェクト指向のスクリプト言語で、同様にPythonとPerl、インタフェースを指定する必要がなく、どちらのクラス間の明示的な継承関係。

インタプリタは、単にプログラマその"信頼"は、このメソッドはポリモーフィックオブジェクトが特定の方法を"持つべきだ"という、我々が実際に持っているときに繰り返します。

同じカテゴリの...
E -ラーニング
RubyとRuby on Rails(コース) RubyとRuby on Rails(コース)
RubyとRoRのと、ソフトウェアやWebアプリケーションを作成します。 39€から。
スポンサーリンク