種類の多態の動作

投稿者:通りすがり 投稿日:2018/09/19(Wed) 22:48:25 No.1643

派生種類のインスタンスの、基底種類の手順を呼び出し、
その手順内から、派生種類の中の手順を呼び出そうとしています。
(同じ基底種類から、複数の派生種類を定義して、処理の部分的な
 共通化をしようとしています)

実行する処理方法の順番や、種類の順番を変えてみても、どうも、
どこかの時点で、解決に行く種類が固定されてしまうようです。
以下のプログラムのまま実行した場合、種類名の表示は、それぞれ
期待した通りなのですが、処理2の実行による表示は全て「C」に
なります(Aを除き、種類名と同じメッセージが表示されるのを期待している)。
-------------------
種類Aとは
 【自分】で処理1する手順
  処理2する
 終わり
 処理2する手順
 終わり
終わり

種類Bとは
 種類Aを継承
 処理2する手順
  「B」を表示
 終わり
終わり

種類Cとは
 種類Aを継承
 処理2する手順
  「C」を表示
 終わり
終わり

種類配列は、{}
種類配列に、(種類Bを作ったもの)を加える
種類配列に、(種類Cを作ったもの)を加える
種類配列に、(種類Aを作ったもの)を加える

個別は、種類Cを作ったもの
個別の種類名を表示する
個別で処理1する
個別は、種類Bを作ったもの
個別の種類名を表示する
個別で処理1する

種類配列を、アイテムにそれぞれ繰り返す
 アイテムの種類名を表示する
 アイテムで処理1する
繰り返す終わり
-----
すべて、基底種類が呼ばれるのであれば、仕様としてはありそうなのですが、
動きが仕様っぽくないので、報告しておきます。

修正しました

投稿者:ゆうと 投稿日:2018/10/08(Mon) 15:32:00 No.1651

こんにちは ゆうとです。

挙動確認できました。
通常、派生種類で同一シグネチャの手順を定義した場合は、その手順を優先する仕様です。
ただ、サンプルのように、補語を持たない手順呼び出しがあった場合に、意図しない手順が実行されておりました。
1.6.929で修正しました。

手順解決の内部処理が複雑でごちゃごちゃになっていますので、もしかすると何か他の箇所に影響するかもしれません。少しずつ整理していきます。

Re: 修正しました

投稿者:通りすがり 投稿日:2018/10/10(Wed) 21:39:01 No.1659

もともとのプログラムで確認しようとしたのですが、別のところでエラーとなり、まだ未確認です。
もしかすると、今回の修正の影響かもしれません。が、当方の潜在バグという可能性も結構あります。
簡単なケースで試した限りでは再現しないため、調査中です。
(PNGとGIFを読み込み、APNG/AnimationGIFを出力するプログラムなので全体を載せるには、でかいです。また、実行にはPluginが2つ必要になります(プロデルではうまく動作しなかった、CRC32計算とGIF→PNG変換をC#でPlugin化。後者は今は大丈夫かも。))

参考までに、以下のような現象です。

・ある種類に、「[自分]から読み取りする手順」と、「[自分]から符号なし短整数として、読み取る手順」がある(ほぼ、バイナリファイルや、バイナリデータと同じ手順群を持っています)
・この種類は、実装無しの種類を継承している(上記手順もそこに定義が含まれる)
・インスタンスから、上記のどちらを呼び出そうとしても、前者が呼び出されてしまう。
・このインスタンスは、うまく呼びせていない処理の引数として呼び出し元から受け取っているが、その際の仮引数の型制約は、実装無しの種類となっている(インスタンスそのもの種類ではない)
・種類の定義のあるファイルと、インスタンスを生成して利用しているファイルは別(プロジェクトを構成している)
・ただし、ここに記載した内容と同じ条件になるように、プロジェクトを生成して、試しても、再現しない(正しく、それぞれのメソッドが呼び出される)

という感じです。

▲ページの先頭へ

- WebForum -