none
インターフェース越しのプロパティ値取得について RRS feed

  • 質問

  • VB.NET 2013 PRO
    Win7

    メインクラス
    Public sub main as string

     Dim 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.】等をイミディエイトウィンドウでやっても
    プロパティ値が表示されず、取得の仕方をご教示頂き度、投稿させて頂きます。


    以上、何卒宜しくお願い申し上げます。

    2015年4月29日 2:07

回答

  • こんにちは。

    コードに細かい間違いが多いので、出来れば見直して頂いたほうが良いと思います。
    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



    2015年4月29日 2:56
    モデレータ
  • CType(print, Result). で取得する事が出来ました。

    確かにそうすれば取得できるでしょうが、それだと何のためにインターフェースを設けているのかわからなくなってしまいます。Resultの型を使用しなくても良いようにするのがそもそもインターフェースの役割です。
    根本的にインターフェースの理解が足らないように思えますが、私の杞憂でしょうか?
    例えが悪いかも知れませんが、全国共通デーパート券を持っているのに、わざわざそれをAデパート固有の商品券に交換して使用しているようなものです。Aデパートに限定せず、いろいろなデパートで使用できるように送った全国共通デパート券なのに、おかしなことになっています。言うまでもありませんが、全国共通デパート券がインタフェースです。このようにインターフェースとは特定の相手を想定しません。なのに、Result型という特定の相手がコード中に出てくるのはおかしな話なのです。


    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    2015年4月30日 1:18
    モデレータ
  • 私は「デバッグ時のイミディエイトウィンドウに限定した話」であると捉えていました。
    実コード上に埋め込むなら trapemiya さんの指摘はごもっともなのですが、実際どうなのでしょう?
    • 回答としてマーク kong0214 2015年7月21日 3:43
    2015年4月30日 1:46
    モデレータ
  • 実コードで、CType(print, Result)と書かれていたら、イミディエイトウィンドウ上でもそう書かれ、今回の質問に至らなかったように思います。また、今回、CType(print, Result)と書けば良いことに初めて気づかれたようですので、むしろ、今後実コード上にこう書かれることを懸念し、インターフェースの理解が足りていないのではないかということを指摘してみました。

    (追記)
    確かにAzuleanさんがおっしゃるようにイミディエイトウィンドウ上だけの問題の可能性もあると思います。ただ、本当にインターフェースを理解していれば、当然ながらCType(print, Result)という発想が出てくるのは普通という思いが私の中の前提としてあります。


    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    2015年4月30日 2:54
    モデレータ

すべての返信

  • こんにちは。

    コードに細かい間違いが多いので、出来れば見直して頂いたほうが良いと思います。
    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



    2015年4月29日 2:56
    モデレータ
  • Tak1wa様

    CType(print, Result). で取得する事が出来ました。

    回答を拝見すると自分の知識では解決出来なかったので非常に助かりました。

    本当に有難う御座いました。

    2015年4月29日 4:50
  • CType(print, Result). で取得する事が出来ました。

    確かにそうすれば取得できるでしょうが、それだと何のためにインターフェースを設けているのかわからなくなってしまいます。Resultの型を使用しなくても良いようにするのがそもそもインターフェースの役割です。
    根本的にインターフェースの理解が足らないように思えますが、私の杞憂でしょうか?
    例えが悪いかも知れませんが、全国共通デーパート券を持っているのに、わざわざそれをAデパート固有の商品券に交換して使用しているようなものです。Aデパートに限定せず、いろいろなデパートで使用できるように送った全国共通デパート券なのに、おかしなことになっています。言うまでもありませんが、全国共通デパート券がインタフェースです。このようにインターフェースとは特定の相手を想定しません。なのに、Result型という特定の相手がコード中に出てくるのはおかしな話なのです。


    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    2015年4月30日 1:18
    モデレータ
  • 私は「デバッグ時のイミディエイトウィンドウに限定した話」であると捉えていました。
    実コード上に埋め込むなら trapemiya さんの指摘はごもっともなのですが、実際どうなのでしょう?
    • 回答としてマーク kong0214 2015年7月21日 3:43
    2015年4月30日 1:46
    モデレータ
  • 実コードで、CType(print, Result)と書かれていたら、イミディエイトウィンドウ上でもそう書かれ、今回の質問に至らなかったように思います。また、今回、CType(print, Result)と書けば良いことに初めて気づかれたようですので、むしろ、今後実コード上にこう書かれることを懸念し、インターフェースの理解が足りていないのではないかということを指摘してみました。

    (追記)
    確かにAzuleanさんがおっしゃるようにイミディエイトウィンドウ上だけの問題の可能性もあると思います。ただ、本当にインターフェースを理解していれば、当然ながらCType(print, Result)という発想が出てくるのは普通という思いが私の中の前提としてあります。


    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    2015年4月30日 2:54
    モデレータ