ドットネット型のオーバロード手順

投稿者:通りすがり 投稿日:2018/10/07(Sun) 15:33:15 No.1650

ドットネット型から作成したインスタンスについて、「:」でインスタンスメソッドを呼び出せるのですが、オーバロードしている場合にうまく呼び出せていないようです。

下記のプログラム中、以下の行が動いてないように思われます。
>g:DrawLine(青ペン,0,0,この幅,この高さ)
試しに、引数を適当に書き換えてもエラーとなりません(一致する引数の数が無くてもエラーとならない)
(ほんとは、ラベルに色の付いた枠線を付けてる実験をしていた)
-------
ペン型は、ドットネット型(「System.Drawing.Pen」)を作ったもの
カラー型は、ドットネット型(「System.Drawing.Color」)を作ったもの

メイン画面を表示する
待機
終了

メイン画面とは
 ウィンドウを継承する
 はじめの手順
  この内容を「テストする」に変える
  この大きさを{200,200}に変える
  テスト対象というテストラベルを作る
   その位置と大きさを{20,20,130,130}に変える
   その内容を「どれ」に変える 
 終わり
終わり

テストラベルとは
 ラベルを継承する
 描画する時の手順
  【g】は、イベントのGraphics
  【青インク】は、カラー型から「FromName」を{「blue」}で呼び出す
  【青ペン】は、ペン型から{青インク,5.0}でインスタンスを作る
  g:DrawLine(青ペン,0,0,この幅,この高さ)
  青ペン:Dispose()
 終わり
終わり
-----

単一のMethodInfoからInvokeも試そうとしたのですが、型引数のリストを付けたGetMethodがうまくゆかず(おそらく同じ理由?)、こちらもうまくゆきませんでした。
overloadのないmethodの場合、method名のみのGetMethodはうまくゆくようです。

なお、Paintイベントは、使い方に合わせて、基底クラスのメソッドを呼び出すかどうか、呼び出す場合にもどのタイミングで呼び出すかを、派生したクラスが決める必要があるため、継承によるOnPaine(描画する手順)の上書きと、基底クラスの同手順の呼び出しが無いと、うまく利用できません(結果として、AddEventHandlerで活用可能なケースと、対応できないケースがあります)

修正しました

投稿者:ゆうと 投稿日:2018/10/09(Tue) 02:38:39 No.1657

通りすがりさん、お世話になっています。

> ドットネット型から作成したインスタンスについて、「:」でインスタンスメソッドを呼び出せるのですが、オーバロードしている場合にうまく呼び出せていないようです。
> >g:DrawLine(青ペン,0,0,この幅,この高さ)

確認しましたところ、
オーバロードされたメソッドで呼び出すべきメソッドを決める処理に問題がありました。
実引数の型が、構文解析時に型推論で決まる場合には、正しく動作していましたが
今回のような動的に生成した値(インスタンス)の場合では、正しく決められない状態になっていました。
また、メソッドが定まらない場合にエラーが表示されていませんでしたので、こちらも合わせて直しました。

MethodInfoクラスのGetMethodメソッドもオーバロードが多数ありますので、今回の修正でこのアプローチもできるかと思います。

一方、メソッドのオーバライド(OnPaint)の件については、
プロデルの仕様上、プラグイン種類を継承した種類は、内部的にはプラグイン種類のラッパを継承して実現しているため、OnPaintメソッドをオーバライドする記述がプロデル上で表現できません。
(フルコンパイラでは実現できそうとは思っていますが、通常のランタイム版では仕様の大幅改訂が必要になります...)

ご参考までに

Re: 修正しました

投稿者:通りすがり 投稿日:2018/10/10(Wed) 21:22:55 No.1658

対応ありがとうございます。
線が引かれることを確認できました。当初の予定についても、DrawRectにして、カラーの枠が描けることも確認できました。

また、OnPaintの件も、完全に置き換えることや、事前に何か描くことはできませんが、今回のように、後から描くことはできるため、それなりに使えそうと思います。(書き足したいというケースが1番多いと思ってます)
ネックは、Graphicsに対して直接メソッドを呼び出す点でしょうか(私にはそれでも十分です)

▲ページの先頭へ

- WebForum -