トップ回答者
インターフェース越しのプロパティ値取得について

質問
-
VB.NET 2013 PRO
Win7メインクラス
Public sub main as stringDim print as IPrint ←クラス作成
print.Print ←印刷クラス呼出
End Sub
インタフェースクラス
Public Interface IPrint
Function Print(Text As String) As String
End Interface印刷クラス
Public Class Result
Implements IPrintable
Public Property aaa As String
Public Property bbb As String
Public Property ccc As String
印刷処理
Public Sub Print
・
・
・
・
end Sub
印刷結果をプロパティにセット
Private Sub MsgSet
aaa = "XXXX"
bbb = "XXXX"
ccc = "XXXX"
end Sub
end Classいつもお世話になっております。
上記で印刷クラスを呼出し、印刷実行後に処理が返ってきます。
その際に、マウスでカーソルを合わせると【aaa】、【bbb】に値がセットされているのですが、
【?print.】や【?print.print】や【?IPrint.】等をイミディエイトウィンドウでやっても
プロパティ値が表示されず、取得の仕方をご教示頂き度、投稿させて頂きます。
以上、何卒宜しくお願い申し上げます。
回答
-
こんにちは。
コードに細かい間違いが多いので、出来れば見直して頂いたほうが良いと思います。
mainメソッドのprint変数はIPrintable型で実体はResult型という仮定で回答しますと、その際に、マウスでカーソルを合わせると【aaa】、【bbb】に値がセットされているのですが
print変数の実体であるResult型のaaa, bbbプロパティを参照しているためだと思います。
【?print.】や【?print.print】や【?IPrint.】等をイミディエイトウィンドウでやってもプロパティ値が表示されず
こちらはaaa~cccがインタフェースを経由したプロパティではないためだからだと思います。
なので ?CType(print, Result). とかキャストするか、
IPrintableインタフェースにプロパティも実装する必要があるようにしてやるかのどちらかになるかと思います。
Interface IPrintable Property aaa As String Property bbb As String Property ccc As String Function Print(Text As String) As String End Interface
- 編集済み Tak1waMVP, Moderator 2015年4月29日 3:09
- 回答としてマーク kong0214 2015年4月29日 4:48
-
CType(print, Result). で取得する事が出来ました。
確かにそうすれば取得できるでしょうが、それだと何のためにインターフェースを設けているのかわからなくなってしまいます。Resultの型を使用しなくても良いようにするのがそもそもインターフェースの役割です。
根本的にインターフェースの理解が足らないように思えますが、私の杞憂でしょうか?
例えが悪いかも知れませんが、全国共通デーパート券を持っているのに、わざわざそれをAデパート固有の商品券に交換して使用しているようなものです。Aデパートに限定せず、いろいろなデパートで使用できるように送った全国共通デパート券なのに、おかしなことになっています。言うまでもありませんが、全国共通デパート券がインタフェースです。このようにインターフェースとは特定の相手を想定しません。なのに、Result型という特定の相手がコード中に出てくるのはおかしな話なのです。
★良い回答には回答済みマークを付けよう! MVP - .NET http://d.hatena.ne.jp/trapemiya/
- 編集済み trapemiyaModerator 2015年4月30日 1:19 誤字修正
- 回答としてマーク kong0214 2015年7月21日 3:42
-
実コードで、CType(print, Result)と書かれていたら、イミディエイトウィンドウ上でもそう書かれ、今回の質問に至らなかったように思います。また、今回、CType(print, Result)と書けば良いことに初めて気づかれたようですので、むしろ、今後実コード上にこう書かれることを懸念し、インターフェースの理解が足りていないのではないかということを指摘してみました。
(追記)
確かにAzuleanさんがおっしゃるようにイミディエイトウィンドウ上だけの問題の可能性もあると思います。ただ、本当にインターフェースを理解していれば、当然ながらCType(print, Result)という発想が出てくるのは普通という思いが私の中の前提としてあります。
★良い回答には回答済みマークを付けよう! MVP - .NET http://d.hatena.ne.jp/trapemiya/
- 編集済み trapemiyaModerator 2015年4月30日 3:02 追記
- 回答としてマーク kong0214 2015年7月21日 3:43
すべての返信
-
こんにちは。
コードに細かい間違いが多いので、出来れば見直して頂いたほうが良いと思います。
mainメソッドのprint変数はIPrintable型で実体はResult型という仮定で回答しますと、その際に、マウスでカーソルを合わせると【aaa】、【bbb】に値がセットされているのですが
print変数の実体であるResult型のaaa, bbbプロパティを参照しているためだと思います。
【?print.】や【?print.print】や【?IPrint.】等をイミディエイトウィンドウでやってもプロパティ値が表示されず
こちらはaaa~cccがインタフェースを経由したプロパティではないためだからだと思います。
なので ?CType(print, Result). とかキャストするか、
IPrintableインタフェースにプロパティも実装する必要があるようにしてやるかのどちらかになるかと思います。
Interface IPrintable Property aaa As String Property bbb As String Property ccc As String Function Print(Text As String) As String End Interface
- 編集済み Tak1waMVP, Moderator 2015年4月29日 3:09
- 回答としてマーク kong0214 2015年4月29日 4:48
-
CType(print, Result). で取得する事が出来ました。
確かにそうすれば取得できるでしょうが、それだと何のためにインターフェースを設けているのかわからなくなってしまいます。Resultの型を使用しなくても良いようにするのがそもそもインターフェースの役割です。
根本的にインターフェースの理解が足らないように思えますが、私の杞憂でしょうか?
例えが悪いかも知れませんが、全国共通デーパート券を持っているのに、わざわざそれをAデパート固有の商品券に交換して使用しているようなものです。Aデパートに限定せず、いろいろなデパートで使用できるように送った全国共通デパート券なのに、おかしなことになっています。言うまでもありませんが、全国共通デパート券がインタフェースです。このようにインターフェースとは特定の相手を想定しません。なのに、Result型という特定の相手がコード中に出てくるのはおかしな話なのです。
★良い回答には回答済みマークを付けよう! MVP - .NET http://d.hatena.ne.jp/trapemiya/
- 編集済み trapemiyaModerator 2015年4月30日 1:19 誤字修正
- 回答としてマーク kong0214 2015年7月21日 3:42
-
実コードで、CType(print, Result)と書かれていたら、イミディエイトウィンドウ上でもそう書かれ、今回の質問に至らなかったように思います。また、今回、CType(print, Result)と書けば良いことに初めて気づかれたようですので、むしろ、今後実コード上にこう書かれることを懸念し、インターフェースの理解が足りていないのではないかということを指摘してみました。
(追記)
確かにAzuleanさんがおっしゃるようにイミディエイトウィンドウ上だけの問題の可能性もあると思います。ただ、本当にインターフェースを理解していれば、当然ながらCType(print, Result)という発想が出てくるのは普通という思いが私の中の前提としてあります。
★良い回答には回答済みマークを付けよう! MVP - .NET http://d.hatena.ne.jp/trapemiya/
- 編集済み trapemiyaModerator 2015年4月30日 3:02 追記
- 回答としてマーク kong0214 2015年7月21日 3:43