甲府方重信Blog

...Shigenobu Koufugatas Blog

  • Increase font size
  • Default font size
  • Decrease font size
Error
  • Unable to load Cache Storage: database
  • Unable to load Cache Storage: database
  • Unable to load Cache Storage: database
  • Unable to load Cache Storage: database
  • Unable to load Cache Storage: database
  • Unable to load Cache Storage: database
  • Unable to load Cache Storage: database
  • Unable to load Cache Storage: database
Home 業務日誌 Adaプログラミング Adaチュートリアル セクション16.7 - Javaインターフェースと別名コンポーネント

Adaチュートリアル セクション16.7 - Javaインターフェースと別名コンポーネント

E-mail Print PDF

 

セクション 16.7 - Javaインターフェースと別名コンポーネント

Javaは、「インターフェース」と呼ばれるコンストラクターを持っています。Javaのインターフェースは、基本的に複数継承の弱くなった形式です。Javaのインターフェースは、プログラマーが継承しようとするクラスのようですが、しかしそのメソッドはすべて、抽象型でなければなりません。インターフェースから「継承」するクラスは、そのインターフェースを「実装する」と言われます。Javaのクラスは、ゼロ、ひとつ、あるいは複数のインターフェースから実装(継承)することができるのです。このように、Javaのクラスが別のクラスから直接継承できるのに対し、(これはAdaにおいても同じですが)、ゼロもしくはそれ以上のインターフェースを実装することもできるのです。

 

Adaは、Javaのインターフェースに直接対応するものを持っていません。しかしながら、Javaのライブラリーを使用するためには、JavaのインターフェースをAdaのプログラムに対して適用する方法がなくてはなりません。ここで、プログラマーが必要とする規約があります。: もしプログラマーがJava言語において「I」として定義されたいくつかのインターフェースを実装しようとするAdaの型を定義しようとしているならば、名前「I」とともに、Ada型のレコードと「aliased I_Obj」型を追加します。例えば、My_Appletアプレットを定義しようとしているとしましょう。プログラマーは、Javaのパッケージ「java.lang」においてRunnableという名前のJavaインターフェースを実装しようとします。プログラマーは、次のように自分のクラスを定義します。:

  with java.applet.Applet; use java.applet.Applet;
  with java.lang.Runnable; use java.lang.Runnable;

  package My_Applet is
    type My_Applet_Obj is new Applet_Obj with
      record
        Runnable : aliased Runnable_Obj;
      end record;
    type My_Applet_Ptr is access all My_Applet_Obj'Class;
  end My_Applet;

 

すべてのインターフェースは、特別なプラグマで印され、それがコンパイラーにインターフェースであることを伝えます。そして、正しいコードを生成するための特別なアクションをとらせるのです。

いくつかの操作は、プログラマーに通常の型ではなく、インターフェース型を渡すよう要求するでしょう。例えば、いくつかのJavaのライブラリーのメソッドは、Javaの「Runnable」型(言い換えれば、Javaの「Applet」型)を要求します。これは問題ではありません。アクセス値Aを渡す代わりに、「Runnable」がインターフェースを表現しているフィールドであれば、A.Runnableのアクセス値のメソッドを渡すのです。たとえば、プログラマーにJavaの「Thread」コンストラクター(Adaでは「new_Thread」と呼ばれます)を呼び出そうとしているとしましょう。このコンストラクターは、「Runnable」型の何かを持っていることが期待されます。プログラマーは次のようにして、新しいThreadを作成することができます。:

 

  My_Thread : Thread_Ptr := new_Thread(X.Runnable'Access);

 

プログラマーは、「Java_Interface」言語型のプラグマ規約を用いて、自分自身の「_Obj」型を認識させることにより自分自身のインターフェースを作成することができます。例えば、もしConcept_Objが実際にプログラマーが定義した新しいインターフェースならば、単純に:

 

  pragma Convention(Java_Interface, Concept_Obj);

 

この上記の"aliased"フレーズは、Javaに特定のものではありませんが、Ada 95の標準の一部です。通常、プログラマーは全体のレコードにアクセス値を獲得するのみであり、何か内部にコンポーネントを持つことはありません。しかしながら、レコードのサブコンポーネントを参照することのできるアクセス値を持ちたい場合があります。Adaは、プログラマーにもしaliasedとしてそのコンポーネントを認識させるならば、そのようにすることを許しています。例えば上記で用いた「X.Runnable'Access」というフレーズは、Runnableが「aliased」としてマークされているので、そのように動作するのです。

Javaインターフェースを実装するこのアプローチは、Adaにおいて必要があれば、そうすべき、多重継承を実装するシンプルな方法を示唆しています。 プログラマーは、「もっとも自然な」クラスを継承に使用することができます。その後で、プログラマーの型のレコードにおいて、他のクラスから継承したいコンポーネントを含むようにすることができるのです。最終的にプログラマーは、これらの別のクラスに対して、呼び出しを再定義することができます。 (Javaのインターフェースの場合において、これはプログラマーに対して部分的に適用されています). しかしながら、もし真の多重継承を利用する場合には、十分に注意してください。: たくさんのオブジェクト指向言語 (SmalltalkとJavaを含む)は、完全な多重継承を持っていません。なぜなら、恐ろしく保守が難しい構造を簡単に作り出してしまうからです。このアプローチを用いるのは、最もシンプルで、最も保守がしやすいアプローチであることがはっきりしている場合に限るべきです。Adaにおける多重継承を実装するための様々なアプローチについての説明が次のページに含まれています。 Ada Rationale Part Two, section 4.6

出典: http://www.adahome.com/Tutorials/Lovelace/s16s7.htm

Last Updated on Friday, 14 December 2012 17:03  

ニュース速報

何千とある無料のエクステンションのライブラリより、あなたはサイトを拡張するために必要とするものを追加できます。 今すぐ Joomla! エクステンション ライブラリに目を通してください。