- PR -

Myクラスみたいなことをしたい

1
投稿者投稿内容
KBR
会議室デビュー日: 2007/05/06
投稿数: 3
お住まい・勤務地: 大阪
投稿日時: 2007-05-20 18:05
[開発言語] .net2005 VisualBasic
[開発形式] Windowsアプリケーション

Myクラスの様に特定の情報をプロジェクト全体で共有できるようしたいのですが
以下の様にコーディングするとコンパイルエラーが出ます。
(エラー[警告]:インスタンスを経由する共有メンバ、定数メンバ、列挙型メンバ、
または入れ子にされた型へのアクセスです。正規の式は評価されません。)

記述方法についてご教授を願いします。

--------------------------------------------------------
サンプルソース
--------------------------------------------------------
コード:
[UserInfo【Myクラスにあたるもの】]
  Public Class UserInfo
      Public Shared myMachine As Machine
      Public Shared myName As Person
  End Class
[Machine【My.ComputerのComputerにあたるもの】]
  Public MustInherit Class Machine
      '<変数>
      Private Shared _IpAdrress As String    'IPアドレス 
      Private Shared _HostName As String     'マシン名

      '<プロパティ>
      '*** 読み取り専用 ***
      '--- IPアドレス  ---
      Public Shared ReadOnly Property IpAdress() As String
          Get
              Return _IpAdrress
          End Get
      End Property
      '--- マシン名  ---
      Public Shared ReadOnly Property HostName() As String
          Get
              Return _HostName
          End Get
      End Property
  
      '<メソッド>
      '*** 一括で情報をセットします ***
      Public Shared Sub SetmachineInfo()
          _IpAdrress = Net.Dns.GetHostEntry(Net.Dns.GetHostName).AddressList(0).ToString
          _HostName = Net.Dns.GetHostName
      End Sub
  End Class

[Person【My.UserのUserにあたるもの】]
  Public Class Person
      '<変数>
      Private Shared _Name As String      '名前 
      Private Shared _Country As String   '出身国 
      Private Shared _Year As UShort      '年齢 

      '<プロパティ>
      '*** 読書OK ***
      '--- 名前  ---
      Public Shared Property Name() As String
          Get
              Return _Name
          End Get
          Set(ByVal value As String)
              _Name = value
          End Set
      End Property
      '--- 出身国  ---
      Public Shared Property Country() As String
          Get
              Return _Country
          End Get
          Set(ByVal value As String)
              _Country = value
          End Set
      End Property
      '--- 年齢  ---
      Public Shared Property Year() As UShort
          Get
              Return _Year
          End Get
          Set(ByVal value As UShort)
              _Year = value
          End Set
      End Property
End Class

[使用例()]
  Public Class TestForm
      Private Sub TestForm_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
          '最初にマシン情報を取得します 
          Call UserInfo.myMachine.SetmachineInfo()   ' <--- エラーが発生
          Call Machine.SetmachineInfo()              ' <--- 直接クラスを指定すると大丈夫
  
          '画面に表示します 
          Label1.Text = UserInfo.myMachine.IpAdress  ' <--- エラーが発生
          Label2.Text = UserInfo.myMachine.HostName  ' <--- エラーが発生
  
          Label1.Text = Machine.IpAdress             ' <--- 直接クラスを指定すると大丈夫
          Label2.Text = Machine.HostName             ' <--- 直接クラスを指定すると大丈夫
  
      End Sub

  Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
          '入力情報でセットします 
          UserInfo.myName.Name = TextBox1.Text       ' <--- エラーが発生
          UserInfo.myName.Country = TextBox2.Text    ' <--- エラーが発生
          UserInfo.myName.Year = TextBox3.Text       ' <--- エラーが発生
  
          Person.Name = TextBox1.Text                ' <--- 直接クラスを指定すると大丈夫
          Person.Country = TextBox2.Text             ' <--- 直接クラスを指定すると大丈夫
          Person.Year = TextBox3.Text                ' <--- 直接クラスを指定すると大丈夫
  End Sub
  End Class



※ UserInfo.myMachine.IpAdrressの様にUserInfoを経由してアクセスしたいです
ぶさいくろう
ぬし
会議室デビュー日: 2005/11/22
投稿数: 1232
お住まい・勤務地: 川崎市(は俺も含めてロクな人間が住んでないよw)
投稿日時: 2007-05-20 18:42
型に直接アクセスしない限り共有メンバーは警告(エラー)になる。
だからUserInfoの中に入れ子で定義すればいいじゃんってことになる。
コード:
Public Class UserInfo
      Public Class Machine
          略
      End Class
      Public Class Person
          略
      End Class
End Class

Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-05-21 07:08
プロジェクト全体でいいなら、普通にクラス作って、ひとつのインスタンスを共有したらええやん。
_________________
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-05-21 09:50
引用:

ぶさいくろうさんの書き込み (2007-05-20 18:42) より:

型に直接アクセスしない限り共有メンバーは警告(エラー)になる。
だからUserInfoの中に入れ子で定義すればいいじゃんってことになる。


それをするくらいなら、こちらの方が良いかもしれません。
(見た目上) My に (仮想的に) 仕立てあげています。

コード:

    Namespace [My]

        Public MustInherit Class Machine
            Public Shared ReadOnly IpAddress As String
            Public Shared ReadOnly HostName  As String

            Shared Sub New()
                '/ 静的コンストラクタで初期化
            End Sub
        End Class

        Public MustInherit Class Person
            Public Shared ReadOnly Name    As String
            Public Shared ReadOnly Country As String
            Public Shared ReadOnly Year    As UShort

            Shared Sub New()
                '/ 静的コンストラクタで初期化
            End Sub
        End Class

    End Namespace


My. とすれば共有メンバにアクセス可能です。

しかしながら、質問者の意図する "My" は 「エイリアスとして利用したい」 という意味を兼ねていると思います。
そうなりますと、共有メンバを使わずインスタンス経由でアクセスすることになるでしょう。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
1

スキルアップ/キャリアアップ(JOB@IT)