JPH10269069A - プログラム処理装置及びプログラム処理方法 - Google Patents
プログラム処理装置及びプログラム処理方法Info
- Publication number
- JPH10269069A JPH10269069A JP6942997A JP6942997A JPH10269069A JP H10269069 A JPH10269069 A JP H10269069A JP 6942997 A JP6942997 A JP 6942997A JP 6942997 A JP6942997 A JP 6942997A JP H10269069 A JPH10269069 A JP H10269069A
- Authority
- JP
- Japan
- Prior art keywords
- class
- program
- cast
- parent
- child
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Landscapes
- Stored Programmes (AREA)
Abstract
(57)【要約】
【課題】 ユーザによるプログラムの編集作業なしに、
子クラスの入れ替えを自由に行えるようにする。 【解決手段】 親子クラス関係登録部4から、継承関係
における親クラスと子クラスとの関係を表す親子クラス
関係情報を登録する。親子クラス関係情報処理部5が、
与えられたプログラムから、登録された前記親子クラス
関係情報に基づいて、子クラス特有のインタフェース関
数を検出し、検出されたインタフェース関数を仮想関数
として親クラスに定義する。
子クラスの入れ替えを自由に行えるようにする。 【解決手段】 親子クラス関係登録部4から、継承関係
における親クラスと子クラスとの関係を表す親子クラス
関係情報を登録する。親子クラス関係情報処理部5が、
与えられたプログラムから、登録された前記親子クラス
関係情報に基づいて、子クラス特有のインタフェース関
数を検出し、検出されたインタフェース関数を仮想関数
として親クラスに定義する。
Description
【0001】
【発明の属する技術分野】本発明は、オブジェクト指向
プログラミングをする際に、インタフェースの統一とク
ラス間の組み合わせを支援するための技術に関するもの
で、特に、継承関係を持つ子クラスについても、自由な
入れ替えを可能にするものである。
プログラミングをする際に、インタフェースの統一とク
ラス間の組み合わせを支援するための技術に関するもの
で、特に、継承関係を持つ子クラスについても、自由な
入れ替えを可能にするものである。
【0002】
【従来の技術】近年、オブジェクト指向によるソフトウ
ェアの開発が普及している。オブジェクト指向の普及の
背景には、大規模/複雑化するソフトウェアに対応する
ために、プログラム開発でソフトウェアの部品化・再利
用という手法が必要不可欠となってきたことがある。オ
ブジェクト指向では、クラスあるいはオブジェクトと呼
ばれるソフトウェアの部品化の単位が存在し、これを上
手く組み合わせてソフトウェアを構築することができ
る。クラスはプログラムの部分であり、プログラムの実
行時には、オブジェクト(インスタンスとも呼ぶ)と呼
ばれる構成単位が、クラスに書かれたとおりに生成され
る。各オブジェクトは、所有するデータを、自分のもつ
操作によって授受しながら各々の機能を果たすことによ
って、プログラムの目的を達成する。
ェアの開発が普及している。オブジェクト指向の普及の
背景には、大規模/複雑化するソフトウェアに対応する
ために、プログラム開発でソフトウェアの部品化・再利
用という手法が必要不可欠となってきたことがある。オ
ブジェクト指向では、クラスあるいはオブジェクトと呼
ばれるソフトウェアの部品化の単位が存在し、これを上
手く組み合わせてソフトウェアを構築することができ
る。クラスはプログラムの部分であり、プログラムの実
行時には、オブジェクト(インスタンスとも呼ぶ)と呼
ばれる構成単位が、クラスに書かれたとおりに生成され
る。各オブジェクトは、所有するデータを、自分のもつ
操作によって授受しながら各々の機能を果たすことによ
って、プログラムの目的を達成する。
【0003】C++のようなオブジェクト指向のプログ
ラミング言語では、部品化をより柔軟なものにするため
に、部品化の単位となるクラスに継承という機能が取り
入れられている。継承とは、クラスに親子関係を持た
せ、親クラスの性質を子クラスが引き継ぐことである。
引き継がれる性質としては、親クラスで定義された手順
やデータなどが挙げられる。なお、親クラスとは、他の
クラスに引き継がれる性質が定義されているクラスであ
り、子クラスは、親クラスで定義された性質を引き継ぐ
クラスである。
ラミング言語では、部品化をより柔軟なものにするため
に、部品化の単位となるクラスに継承という機能が取り
入れられている。継承とは、クラスに親子関係を持た
せ、親クラスの性質を子クラスが引き継ぐことである。
引き継がれる性質としては、親クラスで定義された手順
やデータなどが挙げられる。なお、親クラスとは、他の
クラスに引き継がれる性質が定義されているクラスであ
り、子クラスは、親クラスで定義された性質を引き継ぐ
クラスである。
【0004】ここで、継承におけるクラス間の関係を図
9に例示する。この図において、各矩形は一つずつのク
ラスC1,C2,C3を表し、矩形中で区分された上段
は「クラス名」、中段はクラスの所有する「データ」、
下段はクラスの所有する「操作」を表している。図9
は、親クラス「形」C1のデータや操作といった性質
を、子クラス「四角形」C2及び子クラス「三角形」C
3が引き継いでいることを表している。また、子クラス
C2,C3では、親クラスC1の性質以外のものを独自
に定義することも可能である。
9に例示する。この図において、各矩形は一つずつのク
ラスC1,C2,C3を表し、矩形中で区分された上段
は「クラス名」、中段はクラスの所有する「データ」、
下段はクラスの所有する「操作」を表している。図9
は、親クラス「形」C1のデータや操作といった性質
を、子クラス「四角形」C2及び子クラス「三角形」C
3が引き継いでいることを表している。また、子クラス
C2,C3では、親クラスC1の性質以外のものを独自
に定義することも可能である。
【0005】このような継承関係をコーディングで実現
した場合、親クラスとの継承関係が定義された子クラス
は、独自にコーディングされた要素に加えて、親クラス
に定義されたコーディングを暗黙に所有していることに
なる。ここで、「暗黙に」とは、親クラスで定義された
コーディング内容が、子クラスで再度定義することなく
子クラスの性質に含まれることを意味する。そして、プ
ログラマ(ユーザ)は、自己の意向にしたがって、親ク
ラスの操作の内容を子クラスの定義によって変更した
り、子クラスにおいて、親クラスとは別のデータや操作
のコーディングの追加をしたりすることが可能である。
した場合、親クラスとの継承関係が定義された子クラス
は、独自にコーディングされた要素に加えて、親クラス
に定義されたコーディングを暗黙に所有していることに
なる。ここで、「暗黙に」とは、親クラスで定義された
コーディング内容が、子クラスで再度定義することなく
子クラスの性質に含まれることを意味する。そして、プ
ログラマ(ユーザ)は、自己の意向にしたがって、親ク
ラスの操作の内容を子クラスの定義によって変更した
り、子クラスにおいて、親クラスとは別のデータや操作
のコーディングの追加をしたりすることが可能である。
【0006】このように、クラスの継承関係では、親ク
ラスのコードを子クラスで再利用できるということがま
ず第1の利点として挙げられる。しかし、継承を利用し
た場合の最大の利点とは、親クラスで記述された操作の
定義(以下インタフェース関数と呼ぶ)を子クラスが引
き継ぐことで、子クラスの種類を自由に入れ替えること
ができることにある。
ラスのコードを子クラスで再利用できるということがま
ず第1の利点として挙げられる。しかし、継承を利用し
た場合の最大の利点とは、親クラスで記述された操作の
定義(以下インタフェース関数と呼ぶ)を子クラスが引
き継ぐことで、子クラスの種類を自由に入れ替えること
ができることにある。
【0007】例えば、図9において、親クラス「形」C
1にインタフェース関数を定義し、子クラス「四角形」
C2及び子クラス「三角形」C3が、親クラスC1で定
義されたインタフェース関数に対してそれぞれ独自にそ
の具体的な内容を定義することができる。すなわち、親
クラスC1の「描画する」というインタフェース関数に
対し、四角形のクラスC2では四角形を描画するコーデ
ィングをし、三角形のクラスC3では三角形を描画する
コーディングを記述する。
1にインタフェース関数を定義し、子クラス「四角形」
C2及び子クラス「三角形」C3が、親クラスC1で定
義されたインタフェース関数に対してそれぞれ独自にそ
の具体的な内容を定義することができる。すなわち、親
クラスC1の「描画する」というインタフェース関数に
対し、四角形のクラスC2では四角形を描画するコーデ
ィングをし、三角形のクラスC3では三角形を描画する
コーディングを記述する。
【0008】この手法は、操作の受け口という共通の要
素だけを親クラスに定義し、この受け口に四角形を指定
するか、三角形を指定するかに応じた具体的な手順をそ
れぞれ子クラスで定義することによって、描画をする時
の操作を変えることができる。なお、ここでいう操作の
「受け口」とは、操作を呼び出すために親クラスで定義
されるインタフェース関数である。
素だけを親クラスに定義し、この受け口に四角形を指定
するか、三角形を指定するかに応じた具体的な手順をそ
れぞれ子クラスで定義することによって、描画をする時
の操作を変えることができる。なお、ここでいう操作の
「受け口」とは、操作を呼び出すために親クラスで定義
されるインタフェース関数である。
【0009】このようにすれば、例えば、「丸」クラス
という子クラスが増えた場合でも、「描画する」という
受け口は変更することなく、この受け口を通じて「丸」
を指定することによって、丸のクラスの描画操作を実現
できる。すなわち、親クラスで定義された受け口と、こ
の受け口に対応するインタフェース関数を使ってコーデ
ィングをしたプログラムについては、受け口から呼び出
す子クラスを入れ替えるだけで、実際の操作内容を変え
ることができる。これはクラスの動的結合と呼ばれ、規
格の合っているソフトウェア部品の入れ替えを実現する
ことができる機能である。
という子クラスが増えた場合でも、「描画する」という
受け口は変更することなく、この受け口を通じて「丸」
を指定することによって、丸のクラスの描画操作を実現
できる。すなわち、親クラスで定義された受け口と、こ
の受け口に対応するインタフェース関数を使ってコーデ
ィングをしたプログラムについては、受け口から呼び出
す子クラスを入れ替えるだけで、実際の操作内容を変え
ることができる。これはクラスの動的結合と呼ばれ、規
格の合っているソフトウェア部品の入れ替えを実現する
ことができる機能である。
【0010】
【発明が解決しようとする課題】ただし、この手法によ
って自由に入れ替えができる子クラスは、親クラスのイ
ンタフェース関数のみを用いて作成されたプログラムで
なければならない。しかし、一方で、子クラスには、親
クラスのインタフェース関数の定義にはない独自のイン
タフェース関数を追加することも可能である。このよう
に子クラスに追加されたインタフェース関数を呼出すた
めには、親クラスの受け口に入っている子クラスの種類
を具体的に指定する必要がある。なお、ここでいう「子
クラスの種類」とは、親クラスを通じてどの子クラスを
呼び出すべきかという種類を意味する。このような指定
を子クラスへのキャストと呼ぶ。このように特定の子ク
ラスへのキャストに関するコーディングが入った時点
で、キャスト先の子クラスは自由な入れ替えを行えなく
なってしまう。
って自由に入れ替えができる子クラスは、親クラスのイ
ンタフェース関数のみを用いて作成されたプログラムで
なければならない。しかし、一方で、子クラスには、親
クラスのインタフェース関数の定義にはない独自のイン
タフェース関数を追加することも可能である。このよう
に子クラスに追加されたインタフェース関数を呼出すた
めには、親クラスの受け口に入っている子クラスの種類
を具体的に指定する必要がある。なお、ここでいう「子
クラスの種類」とは、親クラスを通じてどの子クラスを
呼び出すべきかという種類を意味する。このような指定
を子クラスへのキャストと呼ぶ。このように特定の子ク
ラスへのキャストに関するコーディングが入った時点
で、キャスト先の子クラスは自由な入れ替えを行えなく
なってしまう。
【0011】このように、キャストを含むプログラムに
含まれる子クラスを、他の子クラスに入れ替えるには、
キャストする側とされる側のプログラムを全てチェック
し直し、キャストする側とされる側のクラス間でクラス
名称や操作関数名の矛盾が生じないように、手作業でプ
ログラムを編集し直す必要があった。このため、効率的
なプログラミングが妨げられ、子クラスの自由な入れ替
えは困難であった。
含まれる子クラスを、他の子クラスに入れ替えるには、
キャストする側とされる側のプログラムを全てチェック
し直し、キャストする側とされる側のクラス間でクラス
名称や操作関数名の矛盾が生じないように、手作業でプ
ログラムを編集し直す必要があった。このため、効率的
なプログラミングが妨げられ、子クラスの自由な入れ替
えは困難であった。
【0012】ここで、プログラミング言語の例としてC
++を取り上げ、クラスの自由な入れ替えが困難となる
場合を例示する。第1の例として、図10に、継承関係
における親クラスと子クラスの例を示す概念図を示す。
この図において、矢印の先が継承の親を示している。す
なわち、Figureという親クラスと、子クラスとし
てSquare,Triangle,Circleとい
う子クラスが存在するような継承関係が成り立ってい
る。各クラスを表す矩形の上段はクラスの名称であり、
下段はそれぞれのクラスが持っているインタフェース関
数である。
++を取り上げ、クラスの自由な入れ替えが困難となる
場合を例示する。第1の例として、図10に、継承関係
における親クラスと子クラスの例を示す概念図を示す。
この図において、矢印の先が継承の親を示している。す
なわち、Figureという親クラスと、子クラスとし
てSquare,Triangle,Circleとい
う子クラスが存在するような継承関係が成り立ってい
る。各クラスを表す矩形の上段はクラスの名称であり、
下段はそれぞれのクラスが持っているインタフェース関
数である。
【0013】図10に示した各クラスをC++でコーデ
ィングした場合における各クラスのヘッダーファイル
を、図11(a)〜(d)に示す。「public:」
というキーワード以下に示された関数が各クラスのイン
タフェース関数である。また、Figureクラスにお
いて(図11(a))、「virtual」というキー
ワードを持った関数は、子クラスに継承され、かつ、親
クラスのインタフェース関数の受け口を利用できるとい
う意味を持っている。ここでは、virtualvoi
d GetSize(int x,int y)、vi
rtual voidDraw()という2つのインタ
フェース関数について、Square,Triangl
e,Circleという全ての子クラスが暗黙に所有し
ていることになる。この2つの関数については、各クラ
スが共通で持っているので、子クラスの入れ替えを行っ
ても不都合は生じない。
ィングした場合における各クラスのヘッダーファイル
を、図11(a)〜(d)に示す。「public:」
というキーワード以下に示された関数が各クラスのイン
タフェース関数である。また、Figureクラスにお
いて(図11(a))、「virtual」というキー
ワードを持った関数は、子クラスに継承され、かつ、親
クラスのインタフェース関数の受け口を利用できるとい
う意味を持っている。ここでは、virtualvoi
d GetSize(int x,int y)、vi
rtual voidDraw()という2つのインタ
フェース関数について、Square,Triangl
e,Circleという全ての子クラスが暗黙に所有し
ていることになる。この2つの関数については、各クラ
スが共通で持っているので、子クラスの入れ替えを行っ
ても不都合は生じない。
【0014】しかし、Square,Triangl
e,Circleの子クラスに独自に定義されているイ
ンタフェース関数は、それぞれクラス固有のものであ
る。そのため、他のクラスがこの独自のインタフェース
関数を利用した時点で、クラスの入れ替えは不可能にな
ってしまう。例えば、あるクラスが初めSquareク
ラス独自のインタフェース関数を用いて実装を行ってい
たが、SquareクラスをTriangleクラスへ
入れ替える必要が発生したとする。この場合、親クラス
であるFigureクラスの持っているvirtual
関数の呼び出しに関しては問題は生じないが、Squa
reクラス固有の(図11(b))例えばSetSqu
areType関数を呼び出している部分に関しては、
この関数を持っていないTriangleクラスでは対
応できない。このため、SquareクラスをTria
ngleクラスへ入れ替えることは困難となる。
e,Circleの子クラスに独自に定義されているイ
ンタフェース関数は、それぞれクラス固有のものであ
る。そのため、他のクラスがこの独自のインタフェース
関数を利用した時点で、クラスの入れ替えは不可能にな
ってしまう。例えば、あるクラスが初めSquareク
ラス独自のインタフェース関数を用いて実装を行ってい
たが、SquareクラスをTriangleクラスへ
入れ替える必要が発生したとする。この場合、親クラス
であるFigureクラスの持っているvirtual
関数の呼び出しに関しては問題は生じないが、Squa
reクラス固有の(図11(b))例えばSetSqu
areType関数を呼び出している部分に関しては、
この関数を持っていないTriangleクラスでは対
応できない。このため、SquareクラスをTria
ngleクラスへ入れ替えることは困難となる。
【0015】第2の例として、図12に示すクラス情報
が入力されたものとする。また、このクラス情報に対応
するプログラムにおいて、親クラスFigureの入れ
物figに対して、Squareクラスを生成してお
り、Squareクラスの所有する関数であるインタフ
ェース関数DrawInitializeを呼び出した
いものとする。このような場合、従来技術では、Fig
ureクラスの所有していないインタフェース関数Dr
awInitializeを呼び出すためには、生成さ
れた型であるSquareクラスに明示的にキャストす
るという処理が必要であった。
が入力されたものとする。また、このクラス情報に対応
するプログラムにおいて、親クラスFigureの入れ
物figに対して、Squareクラスを生成してお
り、Squareクラスの所有する関数であるインタフ
ェース関数DrawInitializeを呼び出した
いものとする。このような場合、従来技術では、Fig
ureクラスの所有していないインタフェース関数Dr
awInitializeを呼び出すためには、生成さ
れた型であるSquareクラスに明示的にキャストす
るという処理が必要であった。
【0016】すなわち、従来では、このような場合、
((Square*)fig)−>DrawIniti
alize()のように、具体的なキャスト先を指定し
て呼び出しを行う必要があった。このため、Squar
eクラスを例えばTriangleクラスに入れ替えた
い場合、DrawInitializeの呼び出し部分
を((Triangle*))−>DrawIniti
alize()のように直す必要があった。このため、
子クラスへの入れ替えが発生した場合、子クラスの独自
に所有するインタフェース関数を洗い出し、全てキャス
トのためのクラス名を変更するという作業が発生してい
た。
((Square*)fig)−>DrawIniti
alize()のように、具体的なキャスト先を指定し
て呼び出しを行う必要があった。このため、Squar
eクラスを例えばTriangleクラスに入れ替えた
い場合、DrawInitializeの呼び出し部分
を((Triangle*))−>DrawIniti
alize()のように直す必要があった。このため、
子クラスへの入れ替えが発生した場合、子クラスの独自
に所有するインタフェース関数を洗い出し、全てキャス
トのためのクラス名を変更するという作業が発生してい
た。
【0017】本発明は、上記のような従来技術の問題点
を解決するために提案されたものであって、その目的
は、ユーザによるプログラムの編集作業なしに、子クラ
スの入れ替えを自由に行えるようにすることである。ま
た、本発明の他の目的は、利用条件に適した効率的なプ
ログラム開発を可能とすることである。
を解決するために提案されたものであって、その目的
は、ユーザによるプログラムの編集作業なしに、子クラ
スの入れ替えを自由に行えるようにすることである。ま
た、本発明の他の目的は、利用条件に適した効率的なプ
ログラム開発を可能とすることである。
【0018】
【課題を解決するための手段】上記の目的を達成するた
め、請求項1の発明は、複数のクラスを有するプログラ
ムを処理するためのプログラム処理装置において、プロ
グラム中で定義されている親クラスと子クラス間の継承
関係を表す親子クラス関係情報を登録するための手段
と、与えられたプログラムから、登録された前記親子ク
ラス関係情報に基づいて、子クラス特有のインタフェー
ス関数を検出し、検出されたインタフェース関数を仮想
関数として親クラスに定義する手段と、を有することを
特徴とする。請求項4の発明は、請求項1又は3記載の
プログラム処理装置において、前記検出されたインタフ
ェース関数を仮想関数として親クラスに定義する手段
は、与えられたプログラムに含まれる親クラスのインタ
フェース関数と子クラスのインタフェース関数とを比較
することによって、子クラス特有のインタフェース関数
を検出する手段と、検出されたインタフェース関数か
ら、実装なしの仮想関数を定義する構文を作成する手段
と、作成された構文を親クラスの宣言部に加入する手段
と、を有することを特徴とする。請求項7の発明は、請
求項1の発明を方法の観点から把握したものであって、
複数のクラスを有するプログラムを処理するためのプロ
グラム処理方法において、プログラム中で定義されてい
る親クラスと子クラス間の継承関係を表す親子クラス関
係情報を登録するためのステップと、与えられたプログ
ラムから、登録された前記親子クラス関係情報に基づい
て、子クラス特有のインタフェース関数を検出し、検出
されたインタフェース関数を仮想関数として親クラスに
定義するステップと、を含むことを特徴とする。
め、請求項1の発明は、複数のクラスを有するプログラ
ムを処理するためのプログラム処理装置において、プロ
グラム中で定義されている親クラスと子クラス間の継承
関係を表す親子クラス関係情報を登録するための手段
と、与えられたプログラムから、登録された前記親子ク
ラス関係情報に基づいて、子クラス特有のインタフェー
ス関数を検出し、検出されたインタフェース関数を仮想
関数として親クラスに定義する手段と、を有することを
特徴とする。請求項4の発明は、請求項1又は3記載の
プログラム処理装置において、前記検出されたインタフ
ェース関数を仮想関数として親クラスに定義する手段
は、与えられたプログラムに含まれる親クラスのインタ
フェース関数と子クラスのインタフェース関数とを比較
することによって、子クラス特有のインタフェース関数
を検出する手段と、検出されたインタフェース関数か
ら、実装なしの仮想関数を定義する構文を作成する手段
と、作成された構文を親クラスの宣言部に加入する手段
と、を有することを特徴とする。請求項7の発明は、請
求項1の発明を方法の観点から把握したものであって、
複数のクラスを有するプログラムを処理するためのプロ
グラム処理方法において、プログラム中で定義されてい
る親クラスと子クラス間の継承関係を表す親子クラス関
係情報を登録するためのステップと、与えられたプログ
ラムから、登録された前記親子クラス関係情報に基づい
て、子クラス特有のインタフェース関数を検出し、検出
されたインタフェース関数を仮想関数として親クラスに
定義するステップと、を含むことを特徴とする。
【0019】請求項1,4及び7の発明では、子クラス
特有の全てのインタフェース関数も親クラスに定義され
るので、親クラスと子クラスの間でインタフェース関数
が統一される。このため、これらのクラスを利用する側
では、キャストを行わなくとも、子クラス特有の関数を
親クラスのインタフェース関数として呼び出すことがで
きる。これによって、子クラスを入れ替えた場合にプロ
グラムを変更しなくても、インタフェース関数を利用す
る側と利用される側で矛盾が生じない。
特有の全てのインタフェース関数も親クラスに定義され
るので、親クラスと子クラスの間でインタフェース関数
が統一される。このため、これらのクラスを利用する側
では、キャストを行わなくとも、子クラス特有の関数を
親クラスのインタフェース関数として呼び出すことがで
きる。これによって、子クラスを入れ替えた場合にプロ
グラムを変更しなくても、インタフェース関数を利用す
る側と利用される側で矛盾が生じない。
【0020】請求項2の発明は、複数のクラスを有する
プログラムを処理するためのプログラム処理装置におい
て、各クラスが有するインタフェース関数を表すクラス
情報を登録するための手段と、与えられたプログラムに
おいて、インタフェース関数を呼び出すために、キャス
ト先のクラスを特定せずに記述される第1のキャスト構
文を、登録された前記クラス情報に基づいて、当該イン
タフェース関数を有する具体的なクラスへのキャストを
表す第2のキャスト構文に変換する手段と、を有するこ
とを特徴とする。請求項5の発明は、請求項2又は3記
載のプログラム処理装置において、前記第2のキャスト
構文に変換する手段は、所定のキーワードを用いてイン
タフェース関数を呼び出すためのキャストをクラスを特
定せずに表す第1のキャスト構文を、与えられたプログ
ラムから検出する手段と、検出された第1のキャスト構
文に係るインタフェース関数を有するクラスを、前記ク
ラス情報に基づいて、キャスト先候補として特定する手
段と、キャスト先候補のうち、コンパイル時にプログラ
ムに含まれるものに対して、場合分け構文を用いて選択
的にキャストを行うための第2のキャスト構文を作成す
る手段と、作成された第2のキャスト構文によって、前
記第1のキャスト構文を置き換える手段と、を有するこ
とを特徴とする。請求項8の発明は、請求項2の発明を
方法の観点から把握したものであって、複数のクラスを
有するプログラムを処理するためのプログラム処理方法
において、各クラスが有するインタフェース関数を表す
クラス情報を登録するためのステップと、与えられたプ
ログラムにおいて、インタフェース関数を呼び出すため
に、キャスト先のクラスを特定せずに記述される第1の
キャスト構文を、登録された前記クラス情報に基づい
て、当該インタフェース関数を有する具体的なクラスへ
のキャストを表す第2のキャスト構文に変換するステッ
プと、を含むことを特徴とする。
プログラムを処理するためのプログラム処理装置におい
て、各クラスが有するインタフェース関数を表すクラス
情報を登録するための手段と、与えられたプログラムに
おいて、インタフェース関数を呼び出すために、キャス
ト先のクラスを特定せずに記述される第1のキャスト構
文を、登録された前記クラス情報に基づいて、当該イン
タフェース関数を有する具体的なクラスへのキャストを
表す第2のキャスト構文に変換する手段と、を有するこ
とを特徴とする。請求項5の発明は、請求項2又は3記
載のプログラム処理装置において、前記第2のキャスト
構文に変換する手段は、所定のキーワードを用いてイン
タフェース関数を呼び出すためのキャストをクラスを特
定せずに表す第1のキャスト構文を、与えられたプログ
ラムから検出する手段と、検出された第1のキャスト構
文に係るインタフェース関数を有するクラスを、前記ク
ラス情報に基づいて、キャスト先候補として特定する手
段と、キャスト先候補のうち、コンパイル時にプログラ
ムに含まれるものに対して、場合分け構文を用いて選択
的にキャストを行うための第2のキャスト構文を作成す
る手段と、作成された第2のキャスト構文によって、前
記第1のキャスト構文を置き換える手段と、を有するこ
とを特徴とする。請求項8の発明は、請求項2の発明を
方法の観点から把握したものであって、複数のクラスを
有するプログラムを処理するためのプログラム処理方法
において、各クラスが有するインタフェース関数を表す
クラス情報を登録するためのステップと、与えられたプ
ログラムにおいて、インタフェース関数を呼び出すため
に、キャスト先のクラスを特定せずに記述される第1の
キャスト構文を、登録された前記クラス情報に基づい
て、当該インタフェース関数を有する具体的なクラスへ
のキャストを表す第2のキャスト構文に変換するステッ
プと、を含むことを特徴とする。
【0021】請求項2,5及び8の発明では、ユーザ
は、プログラム中でキャストを行う場合、その旨を、キ
ャスト先の子クラスを具体的に特定しない第1のキャス
ト構文で記述しておく。第1のキャスト構文は、所定の
キーワードを用い、特定のクラスに依存せずにキャスト
を表すものである。このようなプログラムが与えられる
と、キーワードを目印に第1のキャスト構文が検出され
る。そして、キャストに係るインタフェース関数を持つ
子クラスが、クラス情報に基づいて、キャスト先候補と
して特定される。第1のキャスト構文は第2のキャスト
構文に置き換えられるが、第2のキャスト構文は、具体
的なキャスト先候補へのキャストを実現するものであ
る。これによって、子クラスが入れ替えられても、プロ
グラム中のクラスから、必要なキャスト先が自動選択さ
れるので、子クラスの入れ替えが自由になる。
は、プログラム中でキャストを行う場合、その旨を、キ
ャスト先の子クラスを具体的に特定しない第1のキャス
ト構文で記述しておく。第1のキャスト構文は、所定の
キーワードを用い、特定のクラスに依存せずにキャスト
を表すものである。このようなプログラムが与えられる
と、キーワードを目印に第1のキャスト構文が検出され
る。そして、キャストに係るインタフェース関数を持つ
子クラスが、クラス情報に基づいて、キャスト先候補と
して特定される。第1のキャスト構文は第2のキャスト
構文に置き換えられるが、第2のキャスト構文は、具体
的なキャスト先候補へのキャストを実現するものであ
る。これによって、子クラスが入れ替えられても、プロ
グラム中のクラスから、必要なキャスト先が自動選択さ
れるので、子クラスの入れ替えが自由になる。
【0022】請求項3の発明は、複数のクラスを有する
プログラムを処理するためのプログラム処理装置におい
て、プログラム中で定義されている親クラスと子クラス
間の継承関係を表す親子クラス関係情報を登録するため
の手段と、与えられたプログラムから、登録された前記
親子クラス関係情報に基づいて、子クラス特有のインタ
フェース関数を検出し、検出されたインタフェース関数
を仮想関数として親クラスに定義する手段と、を有する
第1の処理部と、各クラスが有するインタフェース関数
を表すクラス情報を登録するための手段と、与えられた
プログラムにおいて、インタフェース関数を呼び出すた
めに、キャスト先のクラスを特定せずに記述される第1
のキャスト構文を、登録された前記クラス情報に基づい
て、当該インタフェース関数を有する具体的なクラスへ
のキャストを表す第2のキャスト構文に変換する手段
と、を有する第2の処理部と、前記第1の処理部又は前
記第2の処理部を選択するための手段と、を有すること
を特徴とする。請求項3の発明によれば、ユーザは、子
クラス独自の関数の多少、継承関係の階層数、階層構造
やクラス構造の変化の頻度などの利用条件に応じて、子
クラスの入れ替えを可能にするための第1の処理部と第
2の処理部を自由に選択することができる。このため、
利用条件に適した効率的なプログラム開発が可能とな
る。
プログラムを処理するためのプログラム処理装置におい
て、プログラム中で定義されている親クラスと子クラス
間の継承関係を表す親子クラス関係情報を登録するため
の手段と、与えられたプログラムから、登録された前記
親子クラス関係情報に基づいて、子クラス特有のインタ
フェース関数を検出し、検出されたインタフェース関数
を仮想関数として親クラスに定義する手段と、を有する
第1の処理部と、各クラスが有するインタフェース関数
を表すクラス情報を登録するための手段と、与えられた
プログラムにおいて、インタフェース関数を呼び出すた
めに、キャスト先のクラスを特定せずに記述される第1
のキャスト構文を、登録された前記クラス情報に基づい
て、当該インタフェース関数を有する具体的なクラスへ
のキャストを表す第2のキャスト構文に変換する手段
と、を有する第2の処理部と、前記第1の処理部又は前
記第2の処理部を選択するための手段と、を有すること
を特徴とする。請求項3の発明によれば、ユーザは、子
クラス独自の関数の多少、継承関係の階層数、階層構造
やクラス構造の変化の頻度などの利用条件に応じて、子
クラスの入れ替えを可能にするための第1の処理部と第
2の処理部を自由に選択することができる。このため、
利用条件に適した効率的なプログラム開発が可能とな
る。
【0023】請求項6の発明は、請求項2,3又は5記
載のプログラム処理装置において、前記第2のキャスト
構文を含むプログラムをコンパイルするために必要なラ
イブラリを有することを特徴とする。請求項6の発明で
は、第2のキャスト構文で場合分けされたキャストを実
現するための独自の関数などをライブラリに用意してお
き、用意したそのような関数を用いて効率的なわかりや
すいプログラミングを行うことができる。
載のプログラム処理装置において、前記第2のキャスト
構文を含むプログラムをコンパイルするために必要なラ
イブラリを有することを特徴とする。請求項6の発明で
は、第2のキャスト構文で場合分けされたキャストを実
現するための独自の関数などをライブラリに用意してお
き、用意したそのような関数を用いて効率的なわかりや
すいプログラミングを行うことができる。
【0024】
【発明の実施の形態】以下、本発明の実施の形態を図面
に基づいて説明する。
に基づいて説明する。
【0025】(1)構成 図1は、本実施の形態におけるプログラム処理装置(以
下「本装置」という)の構成を示す機能ブロック図であ
る。この図に示すように、本装置は、まず、各種の情報
や指示などを入力するための入力装置1及び各種の情報
や処理結果などを表示する表示装置2と、入力装置1及
び表示装置2を管理するための入出力管理部3とを有す
る。また、本装置の構成要素は、子クラスの自由な入れ
替えをそれぞれ異なった手法で可能にするための第1の
処理部Aと第2の処理部Bとを含む。
下「本装置」という)の構成を示す機能ブロック図であ
る。この図に示すように、本装置は、まず、各種の情報
や指示などを入力するための入力装置1及び各種の情報
や処理結果などを表示する表示装置2と、入力装置1及
び表示装置2を管理するための入出力管理部3とを有す
る。また、本装置の構成要素は、子クラスの自由な入れ
替えをそれぞれ異なった手法で可能にするための第1の
処理部Aと第2の処理部Bとを含む。
【0026】このうち第1の処理部Aは、請求項1,4
及び7を具体化したもので、第2の処理部Bは、請求項
2,5,6,8を具体化したものである。なお、本装置
は、子クラスの自由な入れ替えを可能とするための手段
として、第1の処理部又は第2の処理部のいずれかを選
択するための切り替え部Sを有する(請求項3)。
及び7を具体化したもので、第2の処理部Bは、請求項
2,5,6,8を具体化したものである。なお、本装置
は、子クラスの自由な入れ替えを可能とするための手段
として、第1の処理部又は第2の処理部のいずれかを選
択するための切り替え部Sを有する(請求項3)。
【0027】(1−1)第1の処理部A 第1の処理部Aは、子クラス特有のインタフェース関数
を親クラスにも定義することによって、子クラスの自由
な入れ替えを可能にするものである。すなわち第1の処
理部Aは、継承関係における親クラスと子クラスとの関
係を表す親子クラス関係情報を登録するための親子クラ
ス関係登録部4と、登録された前記親子クラス関係情報
に基づいて、与えられたプログラムを所定の処理によっ
て展開する親子クラス関係情報処理部5と、を有する。
また、第1の処理部Aは、登録された親子クラス関係情
報を格納するための親子クラス関係情報格納部6と、処
理によって展開されたプログラムを格納するための親子
クラス関係展開情報格納部7と、を有する。
を親クラスにも定義することによって、子クラスの自由
な入れ替えを可能にするものである。すなわち第1の処
理部Aは、継承関係における親クラスと子クラスとの関
係を表す親子クラス関係情報を登録するための親子クラ
ス関係登録部4と、登録された前記親子クラス関係情報
に基づいて、与えられたプログラムを所定の処理によっ
て展開する親子クラス関係情報処理部5と、を有する。
また、第1の処理部Aは、登録された親子クラス関係情
報を格納するための親子クラス関係情報格納部6と、処
理によって展開されたプログラムを格納するための親子
クラス関係展開情報格納部7と、を有する。
【0028】親子クラス関係情報処理部5は、与えられ
たプログラムから、登録された前記親子クラス関係情報
に基づいて、子クラス特有のインタフェース関数を検出
し、検出されたインタフェース関数を仮想関数として親
クラスに定義する手段である。図2は、親子クラス関係
情報処理部5の具体的な構成を示す機能ブロック図であ
る。
たプログラムから、登録された前記親子クラス関係情報
に基づいて、子クラス特有のインタフェース関数を検出
し、検出されたインタフェース関数を仮想関数として親
クラスに定義する手段である。図2は、親子クラス関係
情報処理部5の具体的な構成を示す機能ブロック図であ
る。
【0029】この図に示すように、親子クラス関係情報
処理部5は、特有関数検出部51と、定義作成部52
と、定義加入部53と、を有する。特有関数検出部51
は、与えられたプログラムに含まれる親クラスのインタ
フェース関数と子クラスのインタフェース関数とを比較
することによって、子クラス特有のインタフェース関数
を検出する部分である。定義作成部52は、検出された
インタフェース関数から、実装なしの仮想関数を定義す
る構文を作成する部分である。定義加入部53は、作成
された構文を親クラスの宣言部に加入する部分である。
また、「実装なし」とは、呼ばれた場合の操作が何も定
義されていない関数である。
処理部5は、特有関数検出部51と、定義作成部52
と、定義加入部53と、を有する。特有関数検出部51
は、与えられたプログラムに含まれる親クラスのインタ
フェース関数と子クラスのインタフェース関数とを比較
することによって、子クラス特有のインタフェース関数
を検出する部分である。定義作成部52は、検出された
インタフェース関数から、実装なしの仮想関数を定義す
る構文を作成する部分である。定義加入部53は、作成
された構文を親クラスの宣言部に加入する部分である。
また、「実装なし」とは、呼ばれた場合の操作が何も定
義されていない関数である。
【0030】(1−2)第2の処理部B また、第2の処理部Bは、具体的なクラスを特定せずに
書かれたキャストの構文を、場合分けを用いて適切なク
ラスに自動キャストする構文に書き換えることによっ
て、子クラスの自由な入れ替えを可能にするものであ
る。すなわち、第2の処理部Bは(図1)、各クラスが
有するインタフェース関数を表すクラス情報を登録する
ためのクラス登録部8と、登録された前記クラス情報に
基づいて、与えられたプログラムに所定の処理を行って
プログラムを展開するクラス情報処理部9と、を有す
る。また、第2の処理部Bは、登録されたクラス情報を
格納するためのクラス情報格納部10と、処理によって
展開されたプログラムを格納するためのクラス展開情報
格納部11と、を有する。
書かれたキャストの構文を、場合分けを用いて適切なク
ラスに自動キャストする構文に書き換えることによっ
て、子クラスの自由な入れ替えを可能にするものであ
る。すなわち、第2の処理部Bは(図1)、各クラスが
有するインタフェース関数を表すクラス情報を登録する
ためのクラス登録部8と、登録された前記クラス情報に
基づいて、与えられたプログラムに所定の処理を行って
プログラムを展開するクラス情報処理部9と、を有す
る。また、第2の処理部Bは、登録されたクラス情報を
格納するためのクラス情報格納部10と、処理によって
展開されたプログラムを格納するためのクラス展開情報
格納部11と、を有する。
【0031】クラス情報処理部9は、与えられたプログ
ラムにおいてインタフェース関数を呼び出すためにキャ
スト先を特定せずに記述された第1のキャスト構文を、
登録された前記クラス情報に基づいて、当該インタフェ
ース関数を有する具体的な子クラスへのキャストを行う
第2のキャスト構文に変換する手段である。図3は、ク
ラス情報処理部9の具体的な構成を示す機能ブロック図
である。
ラムにおいてインタフェース関数を呼び出すためにキャ
スト先を特定せずに記述された第1のキャスト構文を、
登録された前記クラス情報に基づいて、当該インタフェ
ース関数を有する具体的な子クラスへのキャストを行う
第2のキャスト構文に変換する手段である。図3は、ク
ラス情報処理部9の具体的な構成を示す機能ブロック図
である。
【0032】この図に示すように、クラス情報処理部9
は、キャスト検出部91と、キャスト先特定部92と、
構文作成部93と、置き換え部94と、を有する。キャ
スト検出部91は、所定のキーワードを用いてインタフ
ェース関数を呼び出すためのキャストをクラスを特定せ
ずに表す第1のキャスト構文を、与えられたプログラム
から検出する部分である。キャスト先特定部92は、検
出された第1のキャスト構文に係るインタフェース関数
を有するクラスを、前記クラス情報に基づいて、キャス
ト先候補として特定する部分である。構文作成部93
は、キャスト先候補のうち、コンパイル時にプログラム
に含まれるものに対して、場合分け構文を用いて選択的
にキャストを行うための第2のキャスト構文を作成する
部分である。置き換え部94は、作成された第2のキャ
スト構文によって、前記第1のキャスト構文を置き換え
る部分である。
は、キャスト検出部91と、キャスト先特定部92と、
構文作成部93と、置き換え部94と、を有する。キャ
スト検出部91は、所定のキーワードを用いてインタフ
ェース関数を呼び出すためのキャストをクラスを特定せ
ずに表す第1のキャスト構文を、与えられたプログラム
から検出する部分である。キャスト先特定部92は、検
出された第1のキャスト構文に係るインタフェース関数
を有するクラスを、前記クラス情報に基づいて、キャス
ト先候補として特定する部分である。構文作成部93
は、キャスト先候補のうち、コンパイル時にプログラム
に含まれるものに対して、場合分け構文を用いて選択的
にキャストを行うための第2のキャスト構文を作成する
部分である。置き換え部94は、作成された第2のキャ
スト構文によって、前記第1のキャスト構文を置き換え
る部分である。
【0033】なお、第2の処理部Bは(図1)、変換デ
ータ格納部12を有しており、変換データ格納部12に
は、前記第2のキャスト構文を含むプログラムを実行形
式に変換(コンパイル)するために必要なライブラリが
格納されている。このライブラリは、第2のキャスト構
文及び、キャストのためのインスタンス登録用にプログ
ラム中で用いられる独自の関数について、具体的な処理
内容を実現するものである。
ータ格納部12を有しており、変換データ格納部12に
は、前記第2のキャスト構文を含むプログラムを実行形
式に変換(コンパイル)するために必要なライブラリが
格納されている。このライブラリは、第2のキャスト構
文及び、キャストのためのインスタンス登録用にプログ
ラム中で用いられる独自の関数について、具体的な処理
内容を実現するものである。
【0034】(2)作用 上記のような構成を有する本実施の形態では、次のよう
な処理によって、子クラスの自由な入れ替えが可能とな
る。なお、ユーザ(プログラマ)は、切り替え部Sを用
い、プログラミング内容に応じて、第1の処理部A又は
第2の処理部Bを選択する。選択された第1の処理部A
又は第2の処理部Bは、それぞれ次のようにプログラム
を処理する。
な処理によって、子クラスの自由な入れ替えが可能とな
る。なお、ユーザ(プログラマ)は、切り替え部Sを用
い、プログラミング内容に応じて、第1の処理部A又は
第2の処理部Bを選択する。選択された第1の処理部A
又は第2の処理部Bは、それぞれ次のようにプログラム
を処理する。
【0035】(2−1)第1の処理部Aによる処理 図4は、第1の処理部Aによる処理手順を示すフローチ
ャートである。
ャートである。
【0036】(2−1−1)親子クラス関係情報の入力 すなわち、この図に示すように、まず、ユーザは、親子
クラス関係登録部4を用いて、継承関係を表す親子クラ
ス関係情報を登録する(ステップ41)。このとき、ユ
ーザは、入力装置1及び入出力管理部3を通じて、親ク
ラスについて、親クラスである旨と、名称とを入力す
る。同様に、ユーザは、各子クラスについて、子クラス
である旨と、名称とを入力する。入力された情報は、親
子クラス関係登録部4によって本装置内に取り込まれ、
親子クラス関係情報格納部6に所定の形式で格納される
(ステップ41)。
クラス関係登録部4を用いて、継承関係を表す親子クラ
ス関係情報を登録する(ステップ41)。このとき、ユ
ーザは、入力装置1及び入出力管理部3を通じて、親ク
ラスについて、親クラスである旨と、名称とを入力す
る。同様に、ユーザは、各子クラスについて、子クラス
である旨と、名称とを入力する。入力された情報は、親
子クラス関係登録部4によって本装置内に取り込まれ、
親子クラス関係情報格納部6に所定の形式で格納される
(ステップ41)。
【0037】(2−1−2)プログラムの入力 次に、ユーザは、プログラムとして、通常の形式でコー
ディングされたソースコードを、入力装置1及び入出力
管理部3を通じて入力する(ステップ42)。ここで入
力するプログラムは、子クラスを入れ替えを意識したも
のである必要はないが、ステップ41で入力された親子
クラス関係情報と対応したものである。また、プログラ
ムのうち入力するのは、全文でもよいが、親クラスと子
クラスそれぞれについて、クラスで用いる関数を宣言し
ている宣言部のヘッダーファイルが入力されれば足り
る。入力されたプログラムは、親子クラス関係情報処理
部5に読み込まれる(ステップ42)。
ディングされたソースコードを、入力装置1及び入出力
管理部3を通じて入力する(ステップ42)。ここで入
力するプログラムは、子クラスを入れ替えを意識したも
のである必要はないが、ステップ41で入力された親子
クラス関係情報と対応したものである。また、プログラ
ムのうち入力するのは、全文でもよいが、親クラスと子
クラスそれぞれについて、クラスで用いる関数を宣言し
ている宣言部のヘッダーファイルが入力されれば足り
る。入力されたプログラムは、親子クラス関係情報処理
部5に読み込まれる(ステップ42)。
【0038】(2−1−3)プログラムの処理(ステッ
プ43〜45) このように親子クラス関係情報と必要なプログラムとが
入力されると、親子クラス関係情報処理部5は、入力さ
れたプログラムと、親子クラス関係情報格納部6に格納
されている親子クラス関係情報に基づいて、プログラム
を処理する。この処理は、与えられたプログラムの中か
ら、親子クラス関係情報に基づいて、子クラス特有のイ
ンタフェース関数を検出し、検出されたインタフェース
関数を仮想関数として親クラスに定義するものである。
この処理は、具体的には次のように行われる。
プ43〜45) このように親子クラス関係情報と必要なプログラムとが
入力されると、親子クラス関係情報処理部5は、入力さ
れたプログラムと、親子クラス関係情報格納部6に格納
されている親子クラス関係情報に基づいて、プログラム
を処理する。この処理は、与えられたプログラムの中か
ら、親子クラス関係情報に基づいて、子クラス特有のイ
ンタフェース関数を検出し、検出されたインタフェース
関数を仮想関数として親クラスに定義するものである。
この処理は、具体的には次のように行われる。
【0039】すなわち、親子クラス関係情報処理部5で
は、特有関数検出部51が(図2)、与えられたプログ
ラムに含まれる親クラスのインタフェース関数と子クラ
スのインタフェース関数とを比較することによって、子
クラスから、親クラスに含まれていない子クラス特有の
インタフェース関数を検出する(ステップ43)。この
とき、親子クラス関係情報が、プログラム中の親クラス
と子クラスを識別するのに用いられる。
は、特有関数検出部51が(図2)、与えられたプログ
ラムに含まれる親クラスのインタフェース関数と子クラ
スのインタフェース関数とを比較することによって、子
クラスから、親クラスに含まれていない子クラス特有の
インタフェース関数を検出する(ステップ43)。この
とき、親子クラス関係情報が、プログラム中の親クラス
と子クラスを識別するのに用いられる。
【0040】次に、定義作成部52が、検出されたイン
タフェース関数から、実装なしの仮想関数を定義する構
文を作成する(ステップ44)。作成された構文は、定
義加入部53によって、親クラスの宣言部に加入される
(ステップ45)。このように仮想関数を定義する構文
が加入されたプログラムは、親子クラス関係展開情報格
納部7に格納され(ステップ46)、コンパイルに用い
られる。
タフェース関数から、実装なしの仮想関数を定義する構
文を作成する(ステップ44)。作成された構文は、定
義加入部53によって、親クラスの宣言部に加入される
(ステップ45)。このように仮想関数を定義する構文
が加入されたプログラムは、親子クラス関係展開情報格
納部7に格納され(ステップ46)、コンパイルに用い
られる。
【0041】なお、本装置では、親子クラス関係情報格
納部6に格納された親子クラス関係情報、入力されたプ
ログラム、親子クラス関係展開情報格納部7に格納され
たプログラムなど所望の情報を、入出力管理部3を介し
て入力装置1及び表示装置2より、自由にユーザが出し
入れすることができる。例えば、格納された各種情報
は、文字情報ファイルとして外部から読み出して利用す
ることが可能であり、また、入出力管理部3を介して、
表示装置2に表示することも可能である。このため、本
装置内の各種情報の利用態様が拡がり、プログラムの開
発作業が効率化される。
納部6に格納された親子クラス関係情報、入力されたプ
ログラム、親子クラス関係展開情報格納部7に格納され
たプログラムなど所望の情報を、入出力管理部3を介し
て入力装置1及び表示装置2より、自由にユーザが出し
入れすることができる。例えば、格納された各種情報
は、文字情報ファイルとして外部から読み出して利用す
ることが可能であり、また、入出力管理部3を介して、
表示装置2に表示することも可能である。このため、本
装置内の各種情報の利用態様が拡がり、プログラムの開
発作業が効率化される。
【0042】(2−1−4)実例 ここで、従来技術として示したものと同じ図10の継承
関係と、同じく図11(a)〜(d)に示したプログラ
ムを例に取り、第1の処理部Aによって子クラスの自由
な入れ替えを実現する場合の例を示す。図10及び図1
1に示した例について、従来技術での問題点は、Squ
areクラス固有のSetSquareType関数の
ように、子クラス固有の関数の呼び出しがプログラム中
に存在すると、呼ばれる関数を持っている子クラスを他
の子クラスに入れ替えられなくなることであった。
関係と、同じく図11(a)〜(d)に示したプログラ
ムを例に取り、第1の処理部Aによって子クラスの自由
な入れ替えを実現する場合の例を示す。図10及び図1
1に示した例について、従来技術での問題点は、Squ
areクラス固有のSetSquareType関数の
ように、子クラス固有の関数の呼び出しがプログラム中
に存在すると、呼ばれる関数を持っている子クラスを他
の子クラスに入れ替えられなくなることであった。
【0043】第1の処理部Aによる処理は、このように
各子クラスが独自に所有しているインタフェース関数
を、全て親クラスであるFigureクラスにvirt
ual関数として定義する。これによって、クラス間の
インタフェース(関数)の呼び出し先を親クラスに統一
し、子クラスの自由な入れ替えを可能にするものであ
る。すなわち、子クラス独自の全てのインタフェース関
数を、親クラスがvirtual関数として持つこと
で、全てのクラスのインタフェース関数がFigure
クラスにおいて共通関数として定義されることになる。
各子クラスが独自に所有しているインタフェース関数
を、全て親クラスであるFigureクラスにvirt
ual関数として定義する。これによって、クラス間の
インタフェース(関数)の呼び出し先を親クラスに統一
し、子クラスの自由な入れ替えを可能にするものであ
る。すなわち、子クラス独自の全てのインタフェース関
数を、親クラスがvirtual関数として持つこと
で、全てのクラスのインタフェース関数がFigure
クラスにおいて共通関数として定義されることになる。
【0044】ただし、定義されるvirtual関数は
実装なし、すなわち、virtual void Se
tSquareType(){}として宣言されなけれ
ばならない。これによって実際にSetSquareT
ype関数を必要としないTriangleクラスにお
いて、もしSetSquareType関数が呼び出さ
れたとしても、何も処理されることはないので、プログ
ラムの予想外の振る舞いのような問題は生じない。この
ように、FigureクラスとSquare,Tria
ngle,Circleの継承におけるクラスのインタ
フェース関数を統一した結果、親クラスであるFigu
reクラスのヘッダーファイルは、図5(e)のように
なる。なお、子クラスのヘッダーファイルについては変
換を要しない。
実装なし、すなわち、virtual void Se
tSquareType(){}として宣言されなけれ
ばならない。これによって実際にSetSquareT
ype関数を必要としないTriangleクラスにお
いて、もしSetSquareType関数が呼び出さ
れたとしても、何も処理されることはないので、プログ
ラムの予想外の振る舞いのような問題は生じない。この
ように、FigureクラスとSquare,Tria
ngle,Circleの継承におけるクラスのインタ
フェース関数を統一した結果、親クラスであるFigu
reクラスのヘッダーファイルは、図5(e)のように
なる。なお、子クラスのヘッダーファイルについては変
換を要しない。
【0045】(2−1−5)第1の処理部Aによる処理
の効果 以上のように、第1の処理部Aによる処理では、ユーザ
が子クラスが独自に持つインタフェース関数を呼び出す
コードを記述したとしても、親クラスのヘッダーファイ
ルの変換処理により、全ての子クラスのインタフェース
関数は親クラスが所有することになる。
の効果 以上のように、第1の処理部Aによる処理では、ユーザ
が子クラスが独自に持つインタフェース関数を呼び出す
コードを記述したとしても、親クラスのヘッダーファイ
ルの変換処理により、全ての子クラスのインタフェース
関数は親クラスが所有することになる。
【0046】すなわち、第1の処理部Aによる処理で
は、子クラス特有の全てのインタフェース関数も親クラ
スに定義されるので、親クラスと子クラスの間でインタ
フェース関数が統一される。このため、これらのクラス
を利用する側では、キャストを行わなくとも、子クラス
特有の関数を親クラスのインタフェース関数として呼び
出すことができる。これによって、子クラスを入れ替え
た場合にプログラムを変更しなくても、インタフェース
関数を利用する側と利用される側で矛盾が生じない。
は、子クラス特有の全てのインタフェース関数も親クラ
スに定義されるので、親クラスと子クラスの間でインタ
フェース関数が統一される。このため、これらのクラス
を利用する側では、キャストを行わなくとも、子クラス
特有の関数を親クラスのインタフェース関数として呼び
出すことができる。これによって、子クラスを入れ替え
た場合にプログラムを変更しなくても、インタフェース
関数を利用する側と利用される側で矛盾が生じない。
【0047】特に、第1の処理部Aによる処理は、子ク
ラス独自のインタフェース関数が親クラスにも定義され
るもので、手法が単純かつ理解容易である。この点が、
子クラス独自に宣言される関数が少ない場合、継承関係
が浅く1階層にとどまる場合、階層構造やクラス構造が
あまり変化しない場合などに優れた適応性を有する。特
に適応性に優れる対象としては、アルゴリズムをクラス
化したような、処理系のプログラムが考えられる。
ラス独自のインタフェース関数が親クラスにも定義され
るもので、手法が単純かつ理解容易である。この点が、
子クラス独自に宣言される関数が少ない場合、継承関係
が浅く1階層にとどまる場合、階層構造やクラス構造が
あまり変化しない場合などに優れた適応性を有する。特
に適応性に優れる対象としては、アルゴリズムをクラス
化したような、処理系のプログラムが考えられる。
【0048】なお、子クラスにおいて、特有のインタフ
ェース関数に関する部分が変更されると、親クラスでの
インタフェース関数の定義が影響される。具体的には、
追加された子クラスの操作を全て親クラスで追加されて
いるかどうかを意識しながらの編集作業が必要になり、
親クラスと継承関係を有する他の子クラスにも影響が生
じる。このため、第1の処理部Aによる処理の方法を手
作業で実行するにはこれらのチェック作業が必須となる
が、本実施の形態の装置を用いれば、これらの作業が自
動化されるので、作業効率が向上する。
ェース関数に関する部分が変更されると、親クラスでの
インタフェース関数の定義が影響される。具体的には、
追加された子クラスの操作を全て親クラスで追加されて
いるかどうかを意識しながらの編集作業が必要になり、
親クラスと継承関係を有する他の子クラスにも影響が生
じる。このため、第1の処理部Aによる処理の方法を手
作業で実行するにはこれらのチェック作業が必須となる
が、本実施の形態の装置を用いれば、これらの作業が自
動化されるので、作業効率が向上する。
【0049】(2−2)第2の処理部Bを用いた処理 ユーザが、切り替え部Sによって、第2の処理部Bを選
択した場合は、次のような処理が行われる。なお、図6
は、第2の処理部Bによる処理手順を示すフローチャー
トである。
択した場合は、次のような処理が行われる。なお、図6
は、第2の処理部Bによる処理手順を示すフローチャー
トである。
【0050】(2−2−1)クラス情報の登録 まず、ユーザは、インタフェースを統一させたいクラス
群について、クラス登録部8を用いて、各クラスが有す
るインタフェース関数を表すクラス情報を登録する(ス
テップ61)。クラス情報としては、各クラス毎に、ク
ラスの名称と、当該クラスで独自に定義されるインタフ
ェース関数を入力する。入力装置1から入力されたクラ
ス情報は、入出力管理部3を介してクラス登録部8によ
ってシステム内に取り込まれ、クラス情報格納部9に所
定の形式で格納される(ステップ61)。
群について、クラス登録部8を用いて、各クラスが有す
るインタフェース関数を表すクラス情報を登録する(ス
テップ61)。クラス情報としては、各クラス毎に、ク
ラスの名称と、当該クラスで独自に定義されるインタフ
ェース関数を入力する。入力装置1から入力されたクラ
ス情報は、入出力管理部3を介してクラス登録部8によ
ってシステム内に取り込まれ、クラス情報格納部9に所
定の形式で格納される(ステップ61)。
【0051】(2−2−2)プログラムの入力 次に、ユーザは、処理したい実装ファイルのプログラム
を入力装置1から入力し、入出力管理部3を経由して、
クラス情報処理部9に与える(ステップ62)。このプ
ログラムは、ステップ61で登録された各クラスに対応
するものである。なお、このプログラムにおいて他のク
ラスへのキャストを用いる場合は、具体的なクラス名は
記述せずに、予め決められた特定のキーワードを用いて
キャストを記述する。なお、このように所定の形式で記
述されたキャストを第1のキャスト構文と呼ぶこととす
る。
を入力装置1から入力し、入出力管理部3を経由して、
クラス情報処理部9に与える(ステップ62)。このプ
ログラムは、ステップ61で登録された各クラスに対応
するものである。なお、このプログラムにおいて他のク
ラスへのキャストを用いる場合は、具体的なクラス名は
記述せずに、予め決められた特定のキーワードを用いて
キャストを記述する。なお、このように所定の形式で記
述されたキャストを第1のキャスト構文と呼ぶこととす
る。
【0052】(2−2−3)プログラムの処理(ステッ
プ63〜66) 以上のようにクラス情報とプログラムが与えられると、
クラス情報処理部9が、クラス情報に基づいてプログラ
ムを処理する。この処理は、全てのキャスト構文につい
て、次のような具体的処理を適用することによって実現
される。
プ63〜66) 以上のようにクラス情報とプログラムが与えられると、
クラス情報処理部9が、クラス情報に基づいてプログラ
ムを処理する。この処理は、全てのキャスト構文につい
て、次のような具体的処理を適用することによって実現
される。
【0053】まず、クラス情報処理部9のキャスト検出
部91が(図3)、所定のキーワードを用いてキャスト
構文を、与えられたプログラムから検出する(ステップ
63)。この検出は、第1のキャスト構文に用いられる
キーワードを、通常の文字列検索で検索することによっ
て行うことができる。
部91が(図3)、所定のキーワードを用いてキャスト
構文を、与えられたプログラムから検出する(ステップ
63)。この検出は、第1のキャスト構文に用いられる
キーワードを、通常の文字列検索で検索することによっ
て行うことができる。
【0054】次に、キャスト先特定部92が、検出され
た第1のキャスト構文で呼び出されるインタフェース関
数を有するクラスを、前記クラス情報に基づいて、キャ
スト先候補として特定する(ステップ64)。この特定
は、第1のキャスト構文がキャスト対象とするインタフ
ェース関数をクラス情報のなかから検索し、当該インタ
フェース関数を持つクラスを全て列挙することによっ
て、行うことができる。ここで特定されたクラスは、キ
ャスト先として利用可能なクラスである。
た第1のキャスト構文で呼び出されるインタフェース関
数を有するクラスを、前記クラス情報に基づいて、キャ
スト先候補として特定する(ステップ64)。この特定
は、第1のキャスト構文がキャスト対象とするインタフ
ェース関数をクラス情報のなかから検索し、当該インタ
フェース関数を持つクラスを全て列挙することによっ
て、行うことができる。ここで特定されたクラスは、キ
ャスト先として利用可能なクラスである。
【0055】続いて、構文作成部93が第2のキャスト
構文を作成する(ステップ65)。この第2のキャスト
構文は、キャスト先候補のうち、コンパイル時にプログ
ラムに含まれるものに対して、場合分け構文を用いて選
択的にキャストを行うためのものである。最後に、置き
換え部94が、作成された第2のキャスト構文と前記第
1のキャスト構文を置き換えることによって、プログラ
ムへの処理が終了する(ステップ66)。
構文を作成する(ステップ65)。この第2のキャスト
構文は、キャスト先候補のうち、コンパイル時にプログ
ラムに含まれるものに対して、場合分け構文を用いて選
択的にキャストを行うためのものである。最後に、置き
換え部94が、作成された第2のキャスト構文と前記第
1のキャスト構文を置き換えることによって、プログラ
ムへの処理が終了する(ステップ66)。
【0056】(2−2−4)処理されたプログラムの利
用 このように、第2のキャスト構文を含んだプログラム
は、クラス展開情報格納部11に格納され(ステップ6
7)、コンパイルに用いられる。なお、このように処理
されたプログラムは、場合分けされたキャストを実現す
るための独自の関数呼び出しを含み、この関数呼び出し
をコンパイルするためのライブラリは、あらかじめ変換
データ格納部12に格納しておく。このライブラリは、
処理されたプログラムに対して、プログラムの実行時に
必要となる変換処理を与える。したがって、コンパイル
の際は、変換データ格納部12に格納されている変換処
理のための関数群を参照しながら、コンパイルを行う。
用 このように、第2のキャスト構文を含んだプログラム
は、クラス展開情報格納部11に格納され(ステップ6
7)、コンパイルに用いられる。なお、このように処理
されたプログラムは、場合分けされたキャストを実現す
るための独自の関数呼び出しを含み、この関数呼び出し
をコンパイルするためのライブラリは、あらかじめ変換
データ格納部12に格納しておく。このライブラリは、
処理されたプログラムに対して、プログラムの実行時に
必要となる変換処理を与える。したがって、コンパイル
の際は、変換データ格納部12に格納されている変換処
理のための関数群を参照しながら、コンパイルを行う。
【0057】なお、本装置では、クラス情報格納部10
に格納されたクラス情報、入力されたプログラム、クラ
ス展開情報格納部11に格納されたプログラムなど、所
望の情報を、入出力管理部3を介して、入力装置1及び
表示装置2より、自由にユーザが出し入れすることがで
きる。例えば、格納された各種情報は、文字情報ファイ
ルとして外部から読み出して利用することが可能であ
り、また、入出力管理部3を介して、表示装置2に表示
することも可能である。このため、本装置内の各種情報
の利用態様が拡がり、プログラムの開発作業が効率化さ
れる。
に格納されたクラス情報、入力されたプログラム、クラ
ス展開情報格納部11に格納されたプログラムなど、所
望の情報を、入出力管理部3を介して、入力装置1及び
表示装置2より、自由にユーザが出し入れすることがで
きる。例えば、格納された各種情報は、文字情報ファイ
ルとして外部から読み出して利用することが可能であ
り、また、入出力管理部3を介して、表示装置2に表示
することも可能である。このため、本装置内の各種情報
の利用態様が拡がり、プログラムの開発作業が効率化さ
れる。
【0058】(2−2−5)第2の処理部Bによる処理
の実例 ここで、第1の処理部Aに関して図10,11で示した
ものと同じ例を用いて、第2の処理部Bによって子クラ
スの自由な入れ替えを実現する場合の例を示す。ここで
解決しようとするのは、子クラスの任意の入れ替えを考
えた時、親クラスであるFigureから継承されたイ
ンタフェース関数ではなく子クラスが固有に持つインタ
フェース関数を呼び出すクラスがあるとき、呼び出され
るインタフェース関数を持つ子クラスの入れ替えが不可
能になるという問題である。
の実例 ここで、第1の処理部Aに関して図10,11で示した
ものと同じ例を用いて、第2の処理部Bによって子クラ
スの自由な入れ替えを実現する場合の例を示す。ここで
解決しようとするのは、子クラスの任意の入れ替えを考
えた時、親クラスであるFigureから継承されたイ
ンタフェース関数ではなく子クラスが固有に持つインタ
フェース関数を呼び出すクラスがあるとき、呼び出され
るインタフェース関数を持つ子クラスの入れ替えが不可
能になるという問題である。
【0059】第1の処理部Aでは、親クラスと子クラス
のインタフェース関数を比較し、子クラスが固有に持つ
インタフェース関数を親クラスで実装なしインタフェー
ス関数として全て定義することで、この問題を解決し
た。これに対して、第2の処理部Bは、親クラスのイン
タフェース関数を増やすことはしない。そして、キャス
ト先の具体的な子クラスをプログラム上であらかじめ指
定することなく、最終的にプログラムに含まれる子クラ
スに自動的にキャスティングを行う構文を、プログラム
に加入する。すると、子クラスを入れ替えても、入れ替
え後にプログラム中に含まれる子クラスの中かから、キ
ャスト先が自動選択されるので、プログラムの編集作業
なしに子クラスを入れ替えることが可能となる。
のインタフェース関数を比較し、子クラスが固有に持つ
インタフェース関数を親クラスで実装なしインタフェー
ス関数として全て定義することで、この問題を解決し
た。これに対して、第2の処理部Bは、親クラスのイン
タフェース関数を増やすことはしない。そして、キャス
ト先の具体的な子クラスをプログラム上であらかじめ指
定することなく、最終的にプログラムに含まれる子クラ
スに自動的にキャスティングを行う構文を、プログラム
に加入する。すると、子クラスを入れ替えても、入れ替
え後にプログラム中に含まれる子クラスの中かから、キ
ャスト先が自動選択されるので、プログラムの編集作業
なしに子クラスを入れ替えることが可能となる。
【0060】ここでは、従来技術で示した例と同様に図
12のクラス情報が入力されたものとする。この例での
従来技術の問題は、Squareクラスを名指ししてイ
ンタフェース関数DrawInitializeを呼び
出す部分がプログラム中にある状態で、キャスト先のS
quareクラスを他のクラスに入れ替えようとする
と、キャスト先を変更するための多くの手作業を要する
点であった。
12のクラス情報が入力されたものとする。この例での
従来技術の問題は、Squareクラスを名指ししてイ
ンタフェース関数DrawInitializeを呼び
出す部分がプログラム中にある状態で、キャスト先のS
quareクラスを他のクラスに入れ替えようとする
と、キャスト先を変更するための多くの手作業を要する
点であった。
【0061】これを解決するためには、キャスト部分に
固有のクラス名を使わなくても、最終的にプログラムに
含まれ、かつ、目的のインタフェース関数を持つ子クラ
スに、自動的にキャストできれば良い。この処理を実現
するために、第2の処理部Bで処理しようとするプログ
ラム(ソースコード)では、図7(a)に示すように、
キャストを用いた関数の呼び出しに「Cast」という
キーワードを付ける。このキーワードを用いたキャスト
の構文が第1のキャスト構文である。
固有のクラス名を使わなくても、最終的にプログラムに
含まれ、かつ、目的のインタフェース関数を持つ子クラ
スに、自動的にキャストできれば良い。この処理を実現
するために、第2の処理部Bで処理しようとするプログ
ラム(ソースコード)では、図7(a)に示すように、
キャストを用いた関数の呼び出しに「Cast」という
キーワードを付ける。このキーワードを用いたキャスト
の構文が第1のキャスト構文である。
【0062】この第1のキャスト構文Cast(fi
g)−>DrawInitialize()は、どのク
ラスにも依存しないキャスティングコードとなる。この
「Cast」キーワードをもとにC++のコードレベル
で自動キャスティングがかけられるように、コードを展
開する。まず「Cast」というキーワードを持つ、
“Cast(fig)−>DrawInitializ
e()”という構文を見つけたら(図7(b))、Dr
awInitialize()関数を持つクラスを、図
12に示したクラス情報から抽出する。ここでは、Sq
uareクラスとTriangleクラスが抽出され
る。
g)−>DrawInitialize()は、どのク
ラスにも依存しないキャスティングコードとなる。この
「Cast」キーワードをもとにC++のコードレベル
で自動キャスティングがかけられるように、コードを展
開する。まず「Cast」というキーワードを持つ、
“Cast(fig)−>DrawInitializ
e()”という構文を見つけたら(図7(b))、Dr
awInitialize()関数を持つクラスを、図
12に示したクラス情報から抽出する。ここでは、Sq
uareクラスとTriangleクラスが抽出され
る。
【0063】抽出されたクラスをもとに、“Cast
(fig)−>DrawInitialize ()”
を図7(c)に表されるコードに展開する。このコード
は考えられるクラスへの場合分けによるキャスティング
を示す。なお、EnterCastは実行時に生成され
るクラスへのアドレスとクラス名を保持する関数であ
り、Castingは渡されたアドレスからキャストす
べきクラス名を返す関数である。なお、ここでは、独自
の関数コールを用いており、この関数コールをコンパイ
ルするために必要な関数ライブラリは、変換データ格納
部12にあらかじめ格納しておく。なお、「独自の関数
コール」とは、あらかじめ用意されたシステム関数では
なく、ユーザによって独自に定義され使用される関数で
ある。コンパイル時には、この変換データ格納部12を
参照することによって、EnterCastとCast
ingという2つの関数を持ったライブラリを利用す
る。
(fig)−>DrawInitialize ()”
を図7(c)に表されるコードに展開する。このコード
は考えられるクラスへの場合分けによるキャスティング
を示す。なお、EnterCastは実行時に生成され
るクラスへのアドレスとクラス名を保持する関数であ
り、Castingは渡されたアドレスからキャストす
べきクラス名を返す関数である。なお、ここでは、独自
の関数コールを用いており、この関数コールをコンパイ
ルするために必要な関数ライブラリは、変換データ格納
部12にあらかじめ格納しておく。なお、「独自の関数
コール」とは、あらかじめ用意されたシステム関数では
なく、ユーザによって独自に定義され使用される関数で
ある。コンパイル時には、この変換データ格納部12を
参照することによって、EnterCastとCast
ingという2つの関数を持ったライブラリを利用す
る。
【0064】図8は、展開された(処理された)プログ
ラム(d)とライブラリ(e)を用いてコンパイルが行
われることを示す概念図である。この2つの関数を用い
ることで、実行時には、プログラム中のクラスから実際
に生成されたオブジェクトへのキャスティングが行われ
ることになる。また、ユーザが作成するプログラムは、
図7(a)の内容なので、子クラスのキャストを意識し
ないコーディングが可能となる。
ラム(d)とライブラリ(e)を用いてコンパイルが行
われることを示す概念図である。この2つの関数を用い
ることで、実行時には、プログラム中のクラスから実際
に生成されたオブジェクトへのキャスティングが行われ
ることになる。また、ユーザが作成するプログラムは、
図7(a)の内容なので、子クラスのキャストを意識し
ないコーディングが可能となる。
【0065】(2−2−6)第2の処理部Bによる処理
の効果 以上のように、第2の処理部Bによる処理では、ユーザ
は、キャストが必要と考えられる部分で、第1のキャス
ト構文を記述しておく。第1のキャスト構文は、所定の
キーワードを用い、特定のクラスに依存せずにキャスト
を表すものである。このようなプログラムが与えられる
と、キーワードを目印に第1のキャスト構文が検出され
る。そして、キャストをすべきインタフェース関数を持
つ子クラスが、クラス情報に基づいて、キャスト先候補
として特定される。第1のキャスト構文は第2のキャス
ト構文に置き換えられるが、第2のキャスト構文は、場
合分けを用いて具体的なキャスト先候補へのキャストを
実現するものである。これによって、子クラスが入れ替
えられても、プログラム中のクラスから、必要なキャス
ト先が自動選択されるので、子クラスの入れ替えが自由
になる。
の効果 以上のように、第2の処理部Bによる処理では、ユーザ
は、キャストが必要と考えられる部分で、第1のキャス
ト構文を記述しておく。第1のキャスト構文は、所定の
キーワードを用い、特定のクラスに依存せずにキャスト
を表すものである。このようなプログラムが与えられる
と、キーワードを目印に第1のキャスト構文が検出され
る。そして、キャストをすべきインタフェース関数を持
つ子クラスが、クラス情報に基づいて、キャスト先候補
として特定される。第1のキャスト構文は第2のキャス
ト構文に置き換えられるが、第2のキャスト構文は、場
合分けを用いて具体的なキャスト先候補へのキャストを
実現するものである。これによって、子クラスが入れ替
えられても、プログラム中のクラスから、必要なキャス
ト先が自動選択されるので、子クラスの入れ替えが自由
になる。
【0066】特に、第2の処理部Bによる処理は、キャ
スト先としては目的のインタフェース関数を持つクラス
が選択され、キャストによって無関係なクラスが影響さ
れることはない。このため、子クラス独自に宣言される
関数が多い、継承関係が1階層より多くなる可能性があ
る、階層構造及びクラス構造が頻繁に変化する場合な
ど、プログラムの構造が複雑な場合でも、優れた適応性
を有する。特に適応性に優れる対象としては、GUI
(グラフィカル・ユーザ・インタフェース)のような継
承関係やクラスの追加・拡張が起こりやすいプログラム
が考えられる。
スト先としては目的のインタフェース関数を持つクラス
が選択され、キャストによって無関係なクラスが影響さ
れることはない。このため、子クラス独自に宣言される
関数が多い、継承関係が1階層より多くなる可能性があ
る、階層構造及びクラス構造が頻繁に変化する場合な
ど、プログラムの構造が複雑な場合でも、優れた適応性
を有する。特に適応性に優れる対象としては、GUI
(グラフィカル・ユーザ・インタフェース)のような継
承関係やクラスの追加・拡張が起こりやすいプログラム
が考えられる。
【0067】なお、第2の処理部Bによる処理では、イ
ンタフェース関数を持つ子クラス(キャスト先候補)が
複数ありうる場合に、考えられるキャスト先候補を全て
列挙し、場合分け(条件分岐)によってキャスト先を振
り分けるプログラムを作成することになる。これによっ
て、ある第1の子クラスが存在するときは第1の子クラ
スへ、第2の子クラスが存在するときは第2の子クラス
へ、というふうに実際のキャストが行われる。そして、
子クラスの種類が増えるたびに、場合分けの構文への追
加が生じるというように、部品の種類の変更や追加によ
って、もとのコーディングに影響を及ぼす。このため、
第2の処理部Bによる処理の方法を手作業で実現するに
は、このようなチェック作業の負担が大きいが、本実施
の形態に示したような装置を用いれば、これらの作業が
自動化されるので、作業効率が向上する。
ンタフェース関数を持つ子クラス(キャスト先候補)が
複数ありうる場合に、考えられるキャスト先候補を全て
列挙し、場合分け(条件分岐)によってキャスト先を振
り分けるプログラムを作成することになる。これによっ
て、ある第1の子クラスが存在するときは第1の子クラ
スへ、第2の子クラスが存在するときは第2の子クラス
へ、というふうに実際のキャストが行われる。そして、
子クラスの種類が増えるたびに、場合分けの構文への追
加が生じるというように、部品の種類の変更や追加によ
って、もとのコーディングに影響を及ぼす。このため、
第2の処理部Bによる処理の方法を手作業で実現するに
は、このようなチェック作業の負担が大きいが、本実施
の形態に示したような装置を用いれば、これらの作業が
自動化されるので、作業効率が向上する。
【0068】また、第2の処理部Bによる処理では、第
2のキャスト構文で場合分けされたキャストを実現する
ための独自の関数などをライブラリ(変換データ格納部
12)に用意しておき、用意したそのような関数を用い
て効率的なわかりやすいプログラミングを行うことがで
きる(請求項6)。
2のキャスト構文で場合分けされたキャストを実現する
ための独自の関数などをライブラリ(変換データ格納部
12)に用意しておき、用意したそのような関数を用い
て効率的なわかりやすいプログラミングを行うことがで
きる(請求項6)。
【0069】(3)本実施の形態による他の効果 また、本実施の形態によれば、ユーザは、切り替え部S
を用いて、子クラス独自の関数の多少、継承関係の階層
数、階層構造やクラス構造の変化の頻度などの利用条件
に応じて、子クラスの入れ替えを可能にするための異な
った手法を自由に選択することができる。このため、利
用条件に適した効率的なプログラム開発が可能となる
(請求項3)。
を用いて、子クラス独自の関数の多少、継承関係の階層
数、階層構造やクラス構造の変化の頻度などの利用条件
に応じて、子クラスの入れ替えを可能にするための異な
った手法を自由に選択することができる。このため、利
用条件に適した効率的なプログラム開発が可能となる
(請求項3)。
【0070】(4)他の実施の形態 なお、本発明は上記実施の形態に限定されるものではな
いので、次に例示するような他の実施の形態をも包含す
るものである。例えば、第1の処理部Aと第2の処理部
Bはいずれか一方だけ設けてもよく、その場合は切り替
え部Sは不要となる。また、上記実施の形態で示したプ
ログラムや各クラスの形式や内容などの具体例は例示に
過ぎず、本発明は所望の形式や内容で実施することがで
きる。
いので、次に例示するような他の実施の形態をも包含す
るものである。例えば、第1の処理部Aと第2の処理部
Bはいずれか一方だけ設けてもよく、その場合は切り替
え部Sは不要となる。また、上記実施の形態で示したプ
ログラムや各クラスの形式や内容などの具体例は例示に
過ぎず、本発明は所望の形式や内容で実施することがで
きる。
【0071】また、第1のキャスト構文や第2のキャス
ト構文などの形式も単なる例示であり、これらは所望の
キーワードと記述形式で実施することができる。また、
本発明は、コンピュータプログラムによって実現するこ
とが一般的と考えられるが、そのようなコンピュータプ
ログラムを記録した記録媒体も本発明の一態様である。
ト構文などの形式も単なる例示であり、これらは所望の
キーワードと記述形式で実施することができる。また、
本発明は、コンピュータプログラムによって実現するこ
とが一般的と考えられるが、そのようなコンピュータプ
ログラムを記録した記録媒体も本発明の一態様である。
【0072】
【発明の効果】以上説明したように、本発明によれば、
子クラスの自由な入れ替えが実現されるので、オブジェ
クト指向におけるプログラミングが効率化され、プログ
ラムの部品化や再利用が促進される。
子クラスの自由な入れ替えが実現されるので、オブジェ
クト指向におけるプログラミングが効率化され、プログ
ラムの部品化や再利用が促進される。
【図1】本発明の実施の形態におけるプログラム処理装
置の構成を示す機能ブロック図
置の構成を示す機能ブロック図
【図2】本発明の実施の形態における親子クラス関係情
報処理部の具体的な構成を示す機能ブロック図
報処理部の具体的な構成を示す機能ブロック図
【図3】本発明の実施の形態におけるクラス情報処理部
の具体的な構成を示す機能ブロック図
の具体的な構成を示す機能ブロック図
【図4】本発明の実施の形態における第1の処理部Aに
よる処理手順を示すフローチャート
よる処理手順を示すフローチャート
【図5】本発明の実施の形態における第1の処理部Aに
よるプログラムの処理の例を示す概念図
よるプログラムの処理の例を示す概念図
【図6】本発明の実施の形態における第2の処理部Bに
よる処理手順を示すフローチャート
よる処理手順を示すフローチャート
【図7】本発明の実施の形態における第2の処理部Bに
よる処理の例を示す概念図
よる処理の例を示す概念図
【図8】本発明の実施の形態における第2の処理部Bに
よって処理されたプログラムを、ライブラリを用いてコ
ンパイルする状態を示す概念図
よって処理されたプログラムを、ライブラリを用いてコ
ンパイルする状態を示す概念図
【図9】継承関係における親クラスと子クラスとの関係
を示す概念図
を示す概念図
【図10】継承関係に係る親クラスと子クラスとの関係
を示す概念図
を示す概念図
【図11】図10の継承関係に対応したプログラムの継
承関係に係る親クラスと子クラスとの関係を示す概念図
承関係に係る親クラスと子クラスとの関係を示す概念図
【図12】本発明の実施の形態における第2の処理部B
による処理に関して、クラス情報の例を示す図
による処理に関して、クラス情報の例を示す図
A…第1の処理部 B…第2の処理部 S…切り替え部 1…入力装置 2…表示装置 3…入出力管理部 4…親子クラス関係登録部 5…親子クラス関係情報処理部 6…親子クラス関係情報格納部 7…親子クラス関係展開情報格納部 8…クラス登録部 9…クラス情報処理部 10…クラス情報格納部 11…クラス展開情報格納部 12…変換データ格納部
Claims (8)
- 【請求項1】 複数のクラスを有するプログラムを処理
するためのプログラム処理装置において、 プログラム中で定義されている親クラスと子クラス間の
継承関係を表す親子クラス関係情報を登録するための手
段と、 与えられたプログラムから、登録された前記親子クラス
関係情報に基づいて、子クラス特有のインタフェース関
数を検出し、検出されたインタフェース関数を仮想関数
として親クラスに定義する手段と、 を有することを特徴とするプログラム処理装置。 - 【請求項2】 複数のクラスを有するプログラムを処理
するためのプログラム処理装置において、 各クラスが有するインタフェース関数を表すクラス情報
を登録するための手段と、 与えられたプログラムにおいて、インタフェース関数を
呼び出すために、キャスト先のクラスを特定せずに記述
される第1のキャスト構文を、登録された前記クラス情
報に基づいて、当該インタフェース関数を有する具体的
なクラスへのキャストを表す第2のキャスト構文に変換
する手段と、 を有することを特徴とするプログラム処理装置。 - 【請求項3】 複数のクラスを有するプログラムを処理
するためのプログラム処理装置において、 プログラム中で定義されている親クラスと子クラス間の
継承関係を表す親子クラス関係情報を登録するための手
段と、与えられたプログラムから、登録された前記親子
クラス関係情報に基づいて、子クラス特有のインタフェ
ース関数を検出し、検出されたインタフェース関数を仮
想関数として親クラスに定義する手段と、を有する第1
の処理部と、 各クラスが有するインタフェース関数を表すクラス情報
を登録するための手段と、与えられたプログラムにおい
て、インタフェース関数を呼び出すために、キャスト先
のクラスを特定せずに記述される第1のキャスト構文
を、登録された前記クラス情報に基づいて、当該インタ
フェース関数を有する具体的なクラスへのキャストを表
す第2のキャスト構文に変換する手段と、を有する第2
の処理部と、 前記第1の処理部又は前記第2の処理部を選択するため
の手段と、 を有することを特徴とするプログラム処理装置。 - 【請求項4】 前記検出されたインタフェース関数を仮
想関数として親クラスに定義する手段は、 与えられたプログラムに含まれる親クラスのインタフェ
ース関数と子クラスのインタフェース関数とを比較する
ことによって、子クラス特有のインタフェース関数を検
出する手段と、 検出されたインタフェース関数から、実装なしの仮想関
数を定義する構文を作成する手段と、 作成された構文を親クラスの宣言部に加入する手段と、 を有することを特徴とする請求項1又は3記載のプログ
ラム処理装置。 - 【請求項5】 前記第2のキャスト構文に変換する手段
は、 所定のキーワードを用いてインタフェース関数を呼び出
すためのキャストをクラスを特定せずに表す第1のキャ
スト構文を、与えられたプログラムから検出する手段
と、 検出された第1のキャスト構文に係るインタフェース関
数を有するクラスを、前記クラス情報に基づいて、キャ
スト先候補として特定する手段と、 キャスト先候補のうち、コンパイル時にプログラムに含
まれるものに対して、場合分け構文を用いて選択的にキ
ャストを行うための第2のキャスト構文を作成する手段
と、 作成された第2のキャスト構文によって、前記第1のキ
ャスト構文を置き換える手段と、 を有することを特徴とする請求項2又は3記載のプログ
ラム処理装置。 - 【請求項6】 前記第2のキャスト構文を含むプログラ
ムをコンパイルするために必要なライブラリを有するこ
とを特徴とする請求項2,3又は5記載のプログラム処
理装置。 - 【請求項7】 複数のクラスを有するプログラムを処理
するためのプログラム処理方法において、 プログラム中で定義されている親クラスと子クラス間の
継承関係を表す親子クラス関係情報を登録するためのス
テップと、 与えられたプログラムから、登録された前記親子クラス
関係情報に基づいて、子クラス特有のインタフェース関
数を検出し、検出されたインタフェース関数を仮想関数
として親クラスに定義するステップと、 を含むことを特徴とするプログラム処理方法。 - 【請求項8】 複数のクラスを有するプログラムを処理
するためのプログラム処理方法において、 各クラスが有するインタフェース関数を表すクラス情報
を登録するためのステップと、 与えられたプログラムにおいて、インタフェース関数を
呼び出すために、キャスト先のクラスを特定せずに記述
される第1のキャスト構文を、登録された前記クラス情
報に基づいて、当該インタフェース関数を有する具体的
なクラスへのキャストを表す第2のキャスト構文に変換
するステップと、 を含むことを特徴とするプログラム処理方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP6942997A JPH10269069A (ja) | 1997-03-24 | 1997-03-24 | プログラム処理装置及びプログラム処理方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP6942997A JPH10269069A (ja) | 1997-03-24 | 1997-03-24 | プログラム処理装置及びプログラム処理方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
JPH10269069A true JPH10269069A (ja) | 1998-10-09 |
Family
ID=13402385
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP6942997A Pending JPH10269069A (ja) | 1997-03-24 | 1997-03-24 | プログラム処理装置及びプログラム処理方法 |
Country Status (1)
Country | Link |
---|---|
JP (1) | JPH10269069A (ja) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2007265335A (ja) * | 2006-03-30 | 2007-10-11 | Nec Corp | Xmlスキーマ編集支援装置及びxmlスキーマ編集支援方法並びにプログラム |
-
1997
- 1997-03-24 JP JP6942997A patent/JPH10269069A/ja active Pending
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2007265335A (ja) * | 2006-03-30 | 2007-10-11 | Nec Corp | Xmlスキーマ編集支援装置及びxmlスキーマ編集支援方法並びにプログラム |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP4365142B2 (ja) | プロパティをオブジェクトに関連付けするための、コンピュータ可読媒体、システム、および、方法 | |
US5864862A (en) | System and method for creating reusable components in an object-oriented programming environment | |
US6023578A (en) | Systems, methods and computer program products for generating an object oriented application for an object oriented environment | |
US6895581B1 (en) | Replaceable classes and virtual constructors for object-oriented programming languages | |
US6931625B1 (en) | Method and system for collapsing a graphical representation of related elements | |
US9600411B2 (en) | System and method for determining an object's lifetime in an object oriented environment | |
US20080134135A1 (en) | Configurable Pattern Detection Method and Apparatus | |
US6633313B1 (en) | Event routing mechanism in a computer system | |
US20040044990A1 (en) | Model-based composable code generation | |
Mens et al. | Automating support for software evolution in UML | |
US20050125805A1 (en) | Method and system for implementing virtual functions of an interface | |
US4964063A (en) | System and method for frame and unit-like symbolic access to knowledge represented by conceptual structures | |
JPH0635709A (ja) | オブジェクトクラス規定装置、ウィジェット及びその実現方法 | |
US8327323B2 (en) | Automatic copying by ancestor in object-oriented languages | |
US9703576B2 (en) | Aspect scoping in a modularity runtime | |
JPH10269069A (ja) | プログラム処理装置及びプログラム処理方法 | |
WO2000046670A1 (en) | Method and system for implementing virtual functions of an interface | |
WO2001025912A1 (en) | Method and system for collapsing a graphical representation of related elements | |
Burd et al. | Enriching program comprehension for software reuse | |
WO2008015110A2 (en) | Methods, apparatus and computer programs for modelling computer programs | |
US7827522B2 (en) | Computer method and apparatus for implementing redefinition of model features | |
Atkinson et al. | Controlling view editability in projection-based modeling environments | |
JP2000039998A (ja) | オブジェクト指向ソフトウェア部品変更支援方法及び装置及びオブジェクト指向ソフトウェア部品変更支援プログラムを格納した記憶媒体 | |
EP0857330B1 (en) | Method for creating reusable components in an object-oriented programming environment | |
Wasserman | Requirements for OO design environments |