DOBON.NET DOBON.NETプログラミング掲示板過去ログ

クラス内の変数に別クラスから設定、それを別クラスから取り出す。

環境/言語:[VB2008 win7 ]
分類:[.NET]

お世話になっております。VB2008です。
ログイン機能のあるシステムを作っているのですが、
ログイン時にユーザーIDをLoginUserクラス内の変数に格納し、
それをまた別のクラスで利用したいのですが、上手くいきません。
いろいろ調べてみたのですが、いま一つ理解できません。
どのようにすればいいのでしょうか?


以下LoginUserクラス

Public Class LoginUser
Public UserID As String ' ログインユーザID

Public Sub LoginUserData()

UserID = ""

End Sub

End Class


Login時に以下のように読み込んで

Public Class Login

Dim user As LoginUser = New LoginUserData()
userData._UserID = "hogehoge"

End Class


hogehogeクラスで利用しようと思います。

Public Class hogehoge

Dim userData As New LoginUserData

MsgBox(userDate.UserID)

End Class
質問内容からすると、クラスやオブジェクト(インスタンス)に関して知識が不足しているように見受けられます。
まずはこちらの内容に目を通してみてください。
http://dobon.net/vb/dotnet/beginner/classinstance.html

■No31552に返信(アンヌさんの記事)
> ログイン時にユーザーIDをLoginUserクラス内の変数に格納し、
> それをまた別のクラスで利用したいのですが、上手くいきません。

Login クラスと hogehoge クラスで別々のオブジェクトを生成しています。
これらは関係のないオブジェクト(別の箱とも言える)ので、
Login クラスで設定した内容は hogehoge クラスと共有されません。

さて、オブジェクトを共有するためには二つ戦略が考えられます。

(1)一つのオブジェクトを何らかの手段で伝達すること。
例(コンパイルは試していないのでエラーになる可能性があります)

Sub Main()
  Dim loginUser As New LoginUser
  Dim login As New Login(loginUser)
  Dim hoge As New hogehoge(loginUser)
End Sub

このコードでは一カ所で LoginUser クラスのオブジェクトを作り、
Login クラスと hogehoge クラスに同じものとして渡しています。
それぞれのクラスではコンストラクタ(Sub New)で引数を受け取り、
フィールド変数に代入します。

Private loginUser As LoginUser
Sub New(ByVal loginUserParam As LoginUser)
  loginUser = loginUserParam
End Sub

各クラスはこの loginUser フィールド変数で参照するようにします。


(2)静的なフィールド変数を使って、参照できるようにする。
アプリケーションで唯一のオブジェクトとして問題ない場合に限りますが、
シングルトンという考え方が使える可能性があります。
http://ja.wikipedia.org/wiki/Singleton_%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3

こちらのサンプルは省略しますが、Shared キーワードをつければ全オブジェクト共通の変数になります。


-----
蛇足になりますが、カプセル化などオブジェクト指向の考え方も
学んでみるとよいかもしれません。
知った上で使わないと判断するのと、知らないとでは大きな差が後で出てくるためです。
ご参考までに。
http://ja.wikipedia.org/wiki/%E3%82%AB%E3%83%97%E3%82%BB%E3%83%AB%E5%8C%96

DOBON.NET | プログラミング道 | プログラミング掲示板