新生活!引っ越してから困らないように注意すべきことは?>>

ライブラリにあるメソッドはcopy()で

コピー処理があるクラスに飛んで、コピーして戻ってくるのはわかりますが、

インターフェース型の使い方がさっぱりわかりません。

簡単にインターフェース型とはどういうものか教えてください。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

ご指摘の通り、.Copy()でした。


あまりいい例ではないんですけど、無理矢理インターフェース型を作るとこんなかんじですかねぇ。。。

メソッドをインターフェース型にするというよりも、
インターフェースを継承しているクラスを、インターフェース型にキャスト無しで代入できると考えたほうがいいのでは?
で、その代入されたインターフェースのメソッドを実行すると、継承先で実装されたクラスの関数を実行できますよと。

インターフェースを継承するクラスの中の実装は何でもいいよ。
そのかわり、必ず同じ名前のメソッドを実装してね。
ってなもんでしょうか・・・ううん。短くていいコードが書けないですが、これで何となくでも参考になればいいかと。


Module Module1

Sub Main()
'インターフェース型に格納
Dim sampA As New SampleClassA
sampA.SampleStrA = "値を入れたよ"
Dim Isca1 As ICopy = sampA
Dim Isca2 As ICopy = New SampleClassB

'動きを確認するために、ちょっと冗長な宣言
'CopyメソッドはSampleClassAクラスを返すので、SampleClassB型には入れれない。
Dim A As SampleClassA = Isca1.Copy()
Dim B As SampleClassA = Isca2.Copy()

Console.WriteLine(A.SampleStrA)
Console.WriteLine(B.SampleStrA)

End Sub

End Module

Public Class SampleClassA
Implements ICopy

Public SampleStrA As String

'コピーメソッド
Public Function Copy() As SampleClassA Implements ICopy.Copy
Dim CopyClass As New SampleClassA
CopyClass.SampleStrA = "" '基本、文字は空白で返します
Return CopyClass
End Function

End Class

Public Class SampleClassB
Implements ICopy

Public SampleStrB As String

'コピーメソッド
Public Function Copy() As SampleClassA Implements ICopy.Copy
Dim CopyClass As New SampleClassA
CopyClass.SampleStrA = "必ずあたいが入っているクラスを返します"
Return CopyClass
End Function

End Class


'インターフェース
Public Interface ICopy
Function Copy() As SampleClassA
End Interface
    • good
    • 0
この回答へのお礼

ありがとうございます!

夏でPCが壊れました・・・返事が遅れてすみませんでした!!

お礼日時:2009/07/15 15:13

すいません、説明が抽象すぎたようです。



「クラスを丸ごとコピー」についてですが、試しに
コンソールアプリケーションを作成して、以下のコードを実行してみて下さい。

Module Module1

Sub Main()

Dim sca1 As New SampleClassA

sca1.SampleStrA = "これはsca1の文字列です"

'sca1 のメッセージ表示
Console.WriteLine(sca1.SampleStrA)

'sca2sca1を代入して、SampleStrAの中身を換えてみる
Dim sca2 As SampleClassA
sca2 = sca1
sca2.SampleStrA = "これはsca2の文字列です"

'sca1とsca2 のメッセージ表示
Console.WriteLine("----sca1とsca2 のメッセージ表示----")
Console.WriteLine(sca1.SampleStrA)
Console.WriteLine(sca2.SampleStrA)

'Copyメソッドを使ってメッセー表示
Dim sca3 As SampleClassA = sca1
sca3.SampleStrA = "これはsca3です"
Console.WriteLine(sca3.SampleStrA)

End Sub

End Module

Class SampleClassA

Public SampleStrA As String

'コピーメソッド
Public Function Copy() As SampleClassA
Dim CopyClass As New SampleClassA
CopyClass.SampleStrA = SampleStrA
Return CopyClass
End Function

End Class

期待値としては、
これはsca1の文字列です
これはsca2の文字列です
と出てほしいのですが、どちらも「これはsca2の文字列です」と出ると思います。
こういう動きは望ましくないので、通常はICopyインターフェイスを実装して、Copy() 関数を作るようにします。

で、クラスの代入の時に
sca2 = sca1.Copy()
とやってあげれば、別々の文字列が出力できるでしょう。(sca3です)

rescue100さんの認識である
>自分が作ったクラスのコピーする関数をICopy()インターフェースに集めることができるってことですか?
>この認識で合っていますか?

については、「集める」という表現が漠然としていますが、
多分大丈夫だと思います。

もう少し厳密にすると、集めるというよりは、ICopyインターフェースを実装すると、Copy()メソッドを必ず実装しなければならないので、
(ああ、コピーできるんだな)って分かる ってだけの話なんです。

極論ですが、
別にICopyインターフェイスなんて実装しなくてもいいのです。今回の上記サンプルには、ICopyインターフェースは実装してません。
ただCopyメソッドがあるだけです。別にKOPI()メソッドでもいいんです。
でも、.NET開発の世間一般のお決まりとして、
「クラスのコピーはCopy()メソッドという名前にしようね」という取り決めがあるので、「このクラスは、コピーできる機能があるから、この関数の名前をCopyにしよう。ああ、そうだCopyインターフェースをつけておけば、他の人が使う時にCopyできるよという目印になるな」

ってなもんで、インターフェースを実装するのです。

だから最初のうちは、インターフェースを実装していると書かれていれば、そういう名前の場合は共通としてお決まりの動きが決められている
と覚えておけばいいと思います。

たまにこんがらがるとすれば、
インターフェースという言葉は別の意味でも使われるので、
上の説明内容であるインターフェースと、別物だと認識できればパニックにならないと思います。

例えば
ファイルインターフェース
そのファイルがどのような内容が書かれているか 等。
    • good
    • 0
この回答へのお礼

ありがとうございます。

実行してみました。
コンソール出力を先にしているから、この場合うまくいってるだけのような・・・

'Copyメソッドを使ってメッセー表示
Dim sca3 As SampleClassA = sca1
sca3.SampleStrA = "これはsca3です"
Console.WriteLine(sca3.SampleStrA)


Dim sca3 As SampleClassA = sca1.copy では???


んーなるほど。
オブジェクト名.メソッド名で、メソッドを呼び出すことが出来るのですね。
いままで、call 関数名()使ってました・・・


このようにメソッドはわかるんですけど、Copy()をICopyインターフェース型にして作ることはできません。

インターフェース型にコピーや貼り付けなどを集めるところまでは理解できたのですが・・・

お礼日時:2009/07/07 15:34

クラスを扱う時に、外側からあたかも別の型のように扱う事ができるように定義するのがインタフェースです。

複数の別のクラスに同じ性質を持たせ、統一的に扱いたい時に便利です。

例)
クラス A と クラス B が共通のインタフェース II 型を持っていると、クラス A と クラス B を、インタフェース II 型として、For Each などで取り扱う事ができます。

Option Strict On
Public Class Form1

Private Interface II
Function Say() As String
End Interface

Private Class A
Implements II

Public Function Say() As String Implements II.Say
Return "Yes"
End Function
End Class

Private Class B
Implements II

Public Function Say() As String Implements II.Say
Return "No"
End Function
End Class

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim objs As II() = New II() {New A(), New B()}
For Each obj As II In objs
MsgBox(obj.Say())
Next
End Sub
End Class

上記例では、インタフェース型の配列 objs を定義していますが、
Dim objs As II() = New II() {New A(), New B()}
配列要素の実体はクラス A とクラス B です。
しかし、あくまでインタフェース型として扱うので、インタフェース型の Say メソッドを For Each で共通的に呼び出す事ができます。
クラス A と クラス B がインタフェース型を持っていない場合には、次のようなコードになるでしょう。

Option Strict On

Public Class Form2

Private Class A
Public Function Say() As String
Return "Yes"
End Function
End Class

Private Class B
Public Function Say() As String
Return "No"
End Function
End Class

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim objs As Object() = New Object() {New A(), New B()}
For Each obj As Object In objs
If TypeOf obj Is A Then
MsgBox(DirectCast(obj, A).Say()) 'あくまでクラス A として扱う
ElseIf TypeOf obj Is B Then
MsgBox(DirectCast(obj, B).Say()) 'あくまでクラス B として扱う
End If
Next
End Sub

End Class
    • good
    • 0
この回答へのお礼

ありがとうございます。

>クラスを扱う時に、外側からあたかも別の型のように扱う事ができるように定義するのがインタフェースです。

私には同じ型に統一しているように見えます。

>Dim objs As II() = New II() {New A(), New B()}

この書き方は、Implementsしているクラス同士でないと記載できないのですか?

>MsgBox(obj.Say())

YESNOって表示されますか?


Handles MyBase.Loadでエラーが出て、デバッグできませんでした。

MsgBox(obj.Say())になにが入るかデバッグモードでVS2005だとどうやればいいのですか?
昔、値に何が入っているか見ながらデバッグやった記憶があります。
トレースモードもやってみましたがなにも表示されない・・・

お礼日時:2009/07/02 19:33

はじめまして。


参照URL貼っておきました。

インターフェイスって、「お約束の名前」だと思えば大丈夫!
例えば携帯電話だと、どの機種にもメニューボタンがあって、数字のボタンがあって、電源ボタンがあって、、、
って必ず決まってますよね。

メニューボタンを押すと、メニュー画面が開きますし、
数字のボタンを押せば数字が画面に表示されて、
電源ボタンは、ちょっとだけ押したら作業がキャンセルされるし、長押ししたら電源が切れます。

これって、機種を買い換える毎にいちいち説明書を見なくてもなんとなく機能が予想できると思います。
ただ、機種によってちょっとだけ動きが違っていて、電源ボタン長しても、「処理をキャンセルしますか?」なんて親切に確認画面がでてくる機種もあるし、いきなり待ち受け画面に飛ばされて残念な気持ちになったりしますよね。

ぱっと見ただけで、なんとなく処理が理解できるような仕組み。
これが「インターフェイスの実装」です。

つまり、「Copyインターフェイスを実装している」と表記されていると、(ああ、このクラスは値のCopyができるんだな。)って分かってよね?
ってことです。(もちろん中の処理はちょっと違いますが。)

先ほど、インターフェースを使った事がない と言ったのは、
一人でプログラムを組んでいる限り、インターフェースが必要になることは殆どないからです。
なぜなら、自分がプログラムを理解していたらそれで事足りるから。

でも、100人とかで一つのプログラムを組んでいたら、クラスの中身を丸ごとコピーするような関数(メソッド)を作って!
とみんなに伝えても、ある人はClone()って名前をつけたり、Copy()って名前を付けたり、もしかしたらkopi()とか、hukusei()なんてつける人もいるかもしれないです。

これだと、後々何がなんだかわからなくなるので、
「絶対にCopy()という名前」で、クラスの中身をコピーする処理を書いてほしいわけです。
インターフェースの機能として、自分で作ったクラス内に、インターフェースを宣言すると(厳密には継承といわれてる?)、インターフェースに実装されている関数名を必ず使わなければコンパイルが通らないようになります。

この機能を利用して、100人全員にICopyインターフェースを宣言してね!って伝えておけば、嫌がおうにもCopy()関数を実装しないとだめなので、統一感が出ますよね。
Copy()関数なのに、文字列に変換するような処理が書かれるともうお手上げですけど^^A

なかなか理解しずらいインターフェイスですが、
今は気にしないでいいと思いますよ!

参考URL:http://www.atmarkit.co.jp/fdotnet/basics/oop07/o …
    • good
    • 0
この回答へのお礼

ありがとうございます。

クラスの中身を丸ごとコピーするってなんですか・・・

インターフェース型は実装される関数名を必ず使わなければならない。なるほど。

自分が作ったクラスのコピーする関数をICopy()インターフェースに集めることができるってことですか?
この認識で合っていますか?

お礼日時:2009/07/02 18:27

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qなぜインタフェースを使うのか?

カテゴリはJavaですが、オブジェクト指向という観点での質問です。

私はオブジェクト指向を勉強中です。(C#)
そこで、疑問に思ったのがタイトルで示したインタフェースについてです。
以下に疑問を列挙します。

1.インタフェースはなぜ使うのですか?
2.使うメリットはなんですか?
3.インタフェースのインスタンスって作れるのですか?
4.インタフェースは必ずどこかのクラスに継承されないといけないのですか?
 単体では何もできないのですか?
5.具体的な使い方を教えてください。

全部でなくてもよいのでわかる方ご教授よろしくお願いいたします。

Aベストアンサー

インターフェースとは「役割」です。
一般的なインターフェースの命名規則は「~ableを末尾に付ける」とあります。例えば「比較できる」なら「ICompareble」です。
メディア再生ならplay,stop等を持ったIPlayableインターフェースが考えられます。これで動画、音楽、静止画が文字通り「再生できます」。

クラスは実装とインターフェースの両方を継承しますが、これでは不便なことが沢山あります。最も不便なのは、余計なメソッドが沢山付いてくること、多重継承でもしない限り、継承だけでは機能を共有しきれない(多重継承は多重継承で、別の問題がある)事です。

インターフェースにはこの制約がありません。「~ができる」という役割に必要なメソッド群を定義し、その役割を持たせたい複数のクラスに実装させれば良いのです。
また逆に、1つのクラスに複数の役割を持たせることができます。


インターフェースは、引数の型指定に使うと用途がよく分かります。
元のインスタンスが何を継承していようと、インターフェースを通じて操作できるのはそのインターフェースに定義されたメソッドだけ、つまり純粋に「ある役割について操作したい」というメソッドを定義できます。


1.インタフェースはなぜ使うのですか?
 継承では制約が多い場面で、特定の「役割」に基づいた操作を定義したいとき、インターフェースを使います。

2.使うメリットはなんですか?
 継承より制約が少ないことです。中身が空っぽというデメリットは、「委譲」で回避できます。委譲とは、実装済みのクラスに処理を委ねてしまう(単なるクラス呼出し)です。

3.インタフェースのインスタンスって作れるのですか?
 作れませんが、インターフェースの引数や変数に、インターフェースを実装したクラスのインスタンスを代入できます。この辺の使い勝手は普通のクラスと同じです。

4.インタフェースは必ずどこかのクラスに継承されないといけないのですか?
 単体では何もできないのですか?
 中身がありませんし、それだけではインスタンス化できませんから、YESです。

5.具体的な使い方を教えてください。
 理論的な話なら「Javaオブジェクト設計」というペーター・コード氏の著作をお薦めします。

 C#での具体例なら、参考URLにプラグインの作り方が載っています。

参考URL:http://dobon.net/vb/dotnet/programing/plugin.html

インターフェースとは「役割」です。
一般的なインターフェースの命名規則は「~ableを末尾に付ける」とあります。例えば「比較できる」なら「ICompareble」です。
メディア再生ならplay,stop等を持ったIPlayableインターフェースが考えられます。これで動画、音楽、静止画が文字通り「再生できます」。

クラスは実装とインターフェースの両方を継承しますが、これでは不便なことが沢山あります。最も不便なのは、余計なメソッドが沢山付いてくること、多重継承でもしない限り、継承だけでは機能を共有しきれ...続きを読む

QCloseとDisposeの違い

みなさまこんばんわです。よろしくお願い申し上げます。

VB.NET 2008でコーディングしています。
CloseとDisposeの違いについて教えていただきたいのです。

これらのメソッドは、開いたファイルを閉じるときなどにも使いますが、今回お尋ねするのは、フォームを閉じるとき、しかも、自ら呼び出すとき(Me.Close() と、Me.Dispose() )のみに限ったこととしてお話しさせていただきます。

たとえば、ShowDialog() で呼び出したフォームは、そのフォーム内でMe.Close() しても、プロセスは残り、たとえば、タイマーコントロールのイベントに記述していますと、それは実行され続けます。

これを防ぐために、Me.Dispose() を使います。すると、きれいにプロセスは終了し、イベントは発生しない模様です。

そこで、「フォームを閉じる」意味のMe.Close() をすべてMe.Dispose() に変えてしまいました。確実にプロセスを破棄出来ると思ったからです。Webで調べると、違いは「再利用できる、できないの違い」という答えがありましたが、それはきっと、ファイルやオブジェクトのことで、フォームの場合は、再びShowまたはShowDialogで表示させることは可能でしたので、特に問題は感じていませんでした。

ところが、アプリケーション設定で、「最後のフォームを閉じるとき」にアプリケーションがシャットダウンする設定になってるのに、シャットダウンしてくれないことが起こりました。調べてみると、Me.Dispose() が原因。Me.Close() に変えるとうまくいきました。

わけわからなくなってきました。。。

ちなみに、その残ったフォームは、スタートアップフォームであり、別のフォームからShowまたはShowDialogメソッドで呼び出したものではありません。

ここで4つの仮説を立ててみました。

1. ShowDialogで呼び出したフォームは、Me.Dispose()、Showで呼び出した、あるいは、スタートアップフォームは、Me.Close() すれば破棄できる

2. ShowDialogで呼び出したフォームは、Me.Dispose()、スタートアップフォームは、Me.Close()、Showで呼び出したフォームは、どちらでも、破棄できる

3. 呼び出し方ではなく、別の要因が存在する

4. 併記する必要がある場合がある

Me.Close()
Me.Dispose()

または、

Me.Dispose()
Me.Close()



どれが正しいのでしょうか?どなたがご存じの方がいらっしゃいましたら、ご教授いただけませんでしょうか? どうぞよろしくお願い申し上げます。ありがとうございました。

みなさまこんばんわです。よろしくお願い申し上げます。

VB.NET 2008でコーディングしています。
CloseとDisposeの違いについて教えていただきたいのです。

これらのメソッドは、開いたファイルを閉じるときなどにも使いますが、今回お尋ねするのは、フォームを閉じるとき、しかも、自ら呼び出すとき(Me.Close() と、Me.Dispose() )のみに限ったこととしてお話しさせていただきます。

たとえば、ShowDialog() で呼び出したフォームは、そのフォーム内でMe.Close() しても、プロセスは残り、たとえば、...続きを読む

Aベストアンサー

Me.Close()
Me.Dispose()
は根本的に違うものです。

formについて、Close()メソッドはフォームの表示を終了させるメソッドです。

ほかのクラスも同様。すべてのDispose()メソッドについて、これはインスタンスの破棄を明示的に行うものです。

>再利用できる、できないの違い

Dispose()はインスタンスが破棄されるため、再びコンストラクタを用いて、インスタンスを生成しないいけません。

一方Close()はインスタンスが残っているので、それを利用することができます。

>1. ところが、アプリケーション設定で、「最後のフォームを閉じるとき」にアプリケーションがシャットダウンする設定になってるのに、シャットダウンしてくれないことが起こりました。調べてみると、Me.Dispose() が原因。
Me.Close() に変えるとうまくいきました。

通常はどちらでもうまくいきます。

>2. ShowDialogで呼び出したフォームは、Me.Dispose()、スタートアップフォームは、Me.Close()、Showで呼び出したフォームは、どちらでも、破棄できる

ShowDialogの場合は、メソッド内部で、ハンドルが破棄されているため、Close()メソッドの際にDispose()メソッドが呼び出されます。

>3. 呼び出し方ではなく、別の要因が存在する

そう思います。

>4. 併記する必要がある場合がある

インスタンスを明示的に破棄したほうがよい場合は多く存在します。
Disposeが使えるメンバはIDisposableをインターフェースとして持っているメンバです。
これらのメンバは、外部とのやり取りを行うものが多くあります。
たとえばSQLClientに含まれるようなメンバです。

外部とのコネクションを確実に破棄を保障してほしいなどという場合がありますよね、このようなときに使用します。

Using構文を使用するのとまったく同じ理由になります。
正確にはUsing構文を使用できるメンバには条件があります、IDisposableをインターフェースとして持っているメンバに限るというものです。

ほかにもガーベージコレクタによるファイナライズを伴うかどうかという違いがあります。
Disposeの場合はファイナライズが同時に行われるため、使用していたメモリ空間を開放することができます。

上記のような理由により、
Me.Close()
Me.Dispose()
は両方書いたほうがよいと思います。

蛇足ですが、
Me.Dispose()
Me.Close()
はエラーになります。
Me.Dispose()により、Me本体(インスタンス)は削除されてしまいます。
存在しないMeに対してCloseメソッドを要求することはできないためです。

Me.Close()
Me.Dispose()
は根本的に違うものです。

formについて、Close()メソッドはフォームの表示を終了させるメソッドです。

ほかのクラスも同様。すべてのDispose()メソッドについて、これはインスタンスの破棄を明示的に行うものです。

>再利用できる、できないの違い

Dispose()はインスタンスが破棄されるため、再びコンストラクタを用いて、インスタンスを生成しないいけません。

一方Close()はインスタンスが残っているので、それを利用することができます。

>1. ところが、アプリ...続きを読む

QVBA オブジェクトが空かどうか判定する

皆様のお知恵を拝借させてください。

エクセルVBAでオブジェクトを入れる変数を定義し、その変数にオブジェクト
が入っているかどうか検査したいのですがどうしたらいいでしょうか。

例えば---
Dim a As Workbook
If a <> nothing then ←この部分が分からない。このままだとエラー。
処理
End if
---------
環境
エクセル2003
WinXPsp1

Aベストアンサー

もし、aが空だったら
If a Is Nothing Then 

もし、aが空じゃなかったら
If Not a Is Nothing Then

QVB.netで、動的な型変換を行いたいのですが、、、(CTypeではできない?!)

VB.netで、
動的な型変換を行いたいと思っています。

イメージ的には、
CType(hogehoge,String)やCType(hogehoge,Integer)
CType(hogehoge,MyClassHogehoge)
ではなく、
CType(hogehoge,"String"),CType(hogehoge,"Integer")
CType(hogehoge,"MyClassHogehoge")
というように、

その場の変数で決まる型変換です。

Dim a as MyClassA
Dim b as Object
とあって
CType(b,a)というような変換をしたいのです。

(が、CTypeやDirectCastの第二引数は、
 定義された型名しか受け付け無いようです。)

-----

実際には、

mytype.InvokeMember("変数名", BindingFlags.SetProperty Or BindingFlags.Public Or BindingFlags.NonPublic Or BindingFlags.Instance, Nothing, "インスタンス", New [Object]() {"設定値"})

という処理をやる上で、

"設定値"が文字列(String)である場合、
"変数名"で、動的にアサインされた変数の型(たとえばMyClass)に型変換しないと、
値が設定できないためです。
(CType("設定値","インスタンス"."変数名")というようなこと必要となってくるはずです、、、)

-----

上記手順が、可能なのかどうか、
まったくのナンセンスなのかどうかも
わかっていないので、
一言でもいただけるとたすかります。。。
どうぞよろしくおねがいいたします。

VB.netで、
動的な型変換を行いたいと思っています。

イメージ的には、
CType(hogehoge,String)やCType(hogehoge,Integer)
CType(hogehoge,MyClassHogehoge)
ではなく、
CType(hogehoge,"String"),CType(hogehoge,"Integer")
CType(hogehoge,"MyClassHogehoge")
というように、

その場の変数で決まる型変換です。

Dim a as MyClassA
Dim b as Object
とあって
CType(b,a)というような変換をしたいのです。

(が、CTypeやDirectCastの第二引数は、
 定義された型名しか受け付け無いようで...続きを読む

Aベストアンサー

関数[init]の第二引数[pStr2]がStringなので、それようの受けを作る必要があります。

Stringでの受けができる状態にしておかないと、クラスに用意したメソッドが見つからなくて落ちます。
ただしObject型は、受けが発生してから領域を確保する変数なので、それは考慮する必要はありません。

以下のようにしたら可能かと思います。

Public Class MyClassA
  Private _A As Integer
  Private _B As Double
  Private _C As Decimal
  Private _D As String
  Private _E As Object

  Public Sub A(ByVal Value As Integer)
    _A = Value
  End Sub
  Public Sub B(ByVal Value As Double)
    _B = Value
  End Sub
  Public Sub C(ByVal Value As Decimal)
    _C = Value
  End Sub
  Public Sub D(ByVal Value As String)
    _D = Value
  End Sub
  Public Sub E(ByVal Value As Object)
    _E = Value
  End Sub

  Public Sub A(ByVal Value As String)
    Call A(CInt(Value))
  End Sub
  Public Sub B(ByVal Value As String)
    Call B(CDbl(Value))
  End Sub
  Public Sub C(ByVal Value As String)
    Call C(CDec(Value))
  End Sub
End Class

関数[init]の第二引数[pStr2]がStringなので、それようの受けを作る必要があります。

Stringでの受けができる状態にしておかないと、クラスに用意したメソッドが見つからなくて落ちます。
ただしObject型は、受けが発生してから領域を確保する変数なので、それは考慮する必要はありません。

以下のようにしたら可能かと思います。

Public Class MyClassA
  Private _A As Integer
  Private _B As Double
  Private _C As Decimal
  Private _D As String
  Private _E As Object

 ...続きを読む

QVB.NETで、DLLを頂いたんですが・・

VB.NETでプログラムを作成しているのですが、
DLLを頂きました。
このDLLをプログラムで使いたいのですがよくわかりません。
(1)DLLは実行ファイルにおけばいいんですよね?
(2)DLLを参照しろっていう設定は必要ですか?
(3)DLLには、プロパティ、メソッド、イベントとあるみたいなんですが、これらを宣言しないといけないと思うのですがどうやればいいのでしょうか?
(4)下のような資料もらったのですがVBcnvというのが定義されていないとエラーがでるのですがどうやって宣言するのでしょう?
private <任意名> as VBcnv

(5)libファイルも一緒にあったのですが、どういう風に使えばいいのでしょうか?何につかうのでしょうか?
すいません、どなたかお助けを~

Aベストアンサー

> 参考資料にはVB6.0のdll追加方法が書いてありまして、それには、参照設定という画面が書いてあります。

それならCOMですね。

>(1) 

インストーラが用意されていないのであれば、手動でレジストする必要があります。

>(2) 

VS.NETのプロジェクトがCOMを参照する必要があります。

>(3)
必要ありません。
VS.NETのプロジェクトがCOMを参照すれば自動的にラッパークラスが作成されます。
オブジェクトブラウザでプロパティ、メソッド、イベントを確認できます。

>(4)

private <任意名> as new ラッパークラス名

>(5)

謎。

QConsole.WriteLine で表示されない

VB2008でプログラムミングしておりますが、プログラミング試験の為によく使われる、「Console.WriteLine」ですが、表示されないのです。
何処に表示されるのでしょうか。
デバックを行っても何処にも表示されません。

Console.WriteLine("Hello World")
でも表示が何処にも有りません。

初歩的な質問ですが、私には大事な一歩なので宜しく御願い致します。

Aベストアンサー

質問者さんはもう見ていないかもしれませんが、一つ。
質問者さんはプロジェクトのタイプをFormにしているので、コンソールに表示されないのです。
プロジェクトのタイプをコンソールアプリケーションにすれば良く見られるDOS窓に表示されます。
Formアプリケーションタイプでも、確かプロジェクトのプロパティをいじればできたはずです。

QVBでグローバル変数を宣言するには

VB初心者ですが。クイズゲームのようなものを作成したいと考えてます。
Private Sub ~ End Sub の中で宣言した変数って他のところに呼び出したり(戻り値として渡す)出来るのでしょうか?
どこでも、いつでも呼び足せるグローバル変数の宣言とはどのようにやるのか、具体的に教えていただけないでしょうか?

Aベストアンサー

>Public a as Integerのように宣言して、初期化するにはどのように記述を行えばよいですか?

>Public a As Boolean = 0
のように記したら”コンパイルエラー”と出ました。

Booleanって整数値取れたかなと思いつつ。
Sub~End Sub内でa = 0を代入したりしてください

扱おうと言うことがあるかどうか疑問だけど

Public Const a As Integer = 10 'グローバルな定数の宣言

QVB.NETが学習できるようなサイト知りませんか?

こんにちは。
自分は現在、仕事でVB.NETを扱うために参考書を使って学習中です。
上の人からは、「とりあえず、関数とか制御構造とか、基本的なことをおさえといて」と言われました。でも、持ってる参考書だけではなんだか物足りないです。サンプルでもいいから、もっとたくさんコーディングしてみたいと思っています。
参考書を買わなくても手軽に勉強したいと思ったので、そういうサイトをご存知の方がいらっしゃれば教えていただきたいのですが。
よろしくお願いいたします。

Aベストアンサー

図書館に行くと結構いろんな本がありました。無料ですし、あまり借りる人もいないのでいつでも貸出可です(笑)
サンプル作品的なものは下のサイトに何個かあるみたいです^^

http://www.mitene.or.jp/~sugisita/vbnet_smp.html
http://jeanne.wankuma.com/tips/
http://133.53.64.43/tonoike/computer/vb/sampleindex.asp
http://anetm.com/dev/tools/vbdotnet/
http://www.ujihara.jp/iTextdotNET/ja/examplesvb.html

Qリフレクションはどういったものですか?

リフレクションはどういったものですか?

プロパティ名・プロパティ値を取得して表示するのに必要不可欠な概念らしいですが、

現在は、↓のように代入しているか、Visual Studio 2005のプロパティ画面でGUI上で直接設定しています。

ボタン名.プロパティ名 = プロパティ値

GUI上で直接設定すると、ソースには表示されないので、プロパティの設定はこの3つだとどれで設定するのがいいですか?

1.Visual Studio 2005のプロパティ画面でGUI上で直接設定
2.ボタン名.プロパティ名 = プロパティ値
3.リフレクション

リフレクションってなんですか・・・

Aベストアンサー

・実行時に変更がないなら1.
・実行時に変更があるなら2.
がよいと思います。
1.であれば,多言語化対応もGUI上で可能です。

で,リフレクションというのは,「実行時の名前によるクラスやメンバ等へのアクセス手段」です。
あまり使われる物ではないですし,使うことを推奨はしませんが,
・クラスの生成
・メソッドの呼び出し
・フィールドやプロパティへの値の設定および値の呼び出し
・イベントへのハンドラの追加や削除
などができます。特に,先頭のクラスの生成を使うと,プラグイン機能を実装できます。
# .NET Framework 3.5ではSystem.AddInという便利なものがありますが。

なお,
Dim text1 As System.Windows.Forms.TextBox
という宣言があるとして,
text1.Text = "ABC"
をリフレクション使って書くと,
Dim text1Type As System.Type = text1.GetType()
Dim textProp As System.Reflection.PropertyInfo = text1Type.GetProperty("Text")
textProp.SetValue(text1, "ABC", Nothing)
のようになります。

・読みにくい
・重い
・実行時までエラー検出ができない
という問題点があるので,本当に必要な場合のみ使うことをお勧めします。
プラグインでも,作ったインスタンスをインターフェイスに押し込めてあとはリフレクションは使わないのが普通です。

MSDN: Type.GetProperty メソッド (String) (System)
http://msdn.microsoft.com/ja-jp/library/kz0a8sxy(VS.80).aspx
MSDN: PropertyInfo クラス (System.Reflection)
http://msdn.microsoft.com/ja-jp/library/system.reflection.propertyinfo(VS.80).aspx
MSDN: PropertyInfo.SetValue メソッド (Object, Object, Object[]) (System.Reflection)
http://msdn.microsoft.com/ja-jp/library/xb5dd1f1(VS.80).aspx

・実行時に変更がないなら1.
・実行時に変更があるなら2.
がよいと思います。
1.であれば,多言語化対応もGUI上で可能です。

で,リフレクションというのは,「実行時の名前によるクラスやメンバ等へのアクセス手段」です。
あまり使われる物ではないですし,使うことを推奨はしませんが,
・クラスの生成
・メソッドの呼び出し
・フィールドやプロパティへの値の設定および値の呼び出し
・イベントへのハンドラの追加や削除
などができます。特に,先頭のクラスの生成を使うと,プラグイン機能を実装...続きを読む

QVB.NETでラベルの大きさってどうやって変えるの?

VB.NETでラベルの大きさってどうやって変えるの?
バージョンは2008

Aベストアンサー

あれ?
普通に
Widthプロパティ
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.width%28VS.100%29.aspx
やHeightプロパティを変更すればできるはずだけど、コード、IDE問わず。
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.height%28VS.100%29.aspx

#まぁAutoSizeプロパティをfalseにしないと、Textプロパティに代入された文字列を格納するのに必要な最低限の大きさに自動で調整されちゃうみたいだけど。
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.autosize.aspx


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング