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

プロジェクトの外側に公開できないエラー

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

 GPIBで測定器を制御する自動測定システムを作っています。測定場所が2カ所
有るのですが、それぞれ違うプログラムを作ると管理がしにくい為、同じプログ
ラムを走らせ、ドロップダウンリストでどの測定場所で測るのかを切り替えられ
るようにしたいと思っています。
 測定器毎にコマンドや処理が微妙に違うので、測定器毎にクラスを作り、それ
を実行時にドロップダウンリストで切り替えればいいかと思い、次のようなプロ
グラムを作りました。

'------------------------------------------------------------------
Public Class Class1
  Public Overridable Function GetData(ByVal d As strc) As Integer

    ' データ取得処理

    Return 1
  End Function

  Public Sub Init()
    ' イニシャライズ
  End Sub
End Class
'------------------------------------------------------------------
Public Class Class2
  Inherits Class1

  Public Overrides Function GetData(ByVal d As strc) As Integer

    ' データ取得処理

    Return 2
  End Function
End Class
'------------------------------------------------------------------
Module Module1
  Public Structure strc
    Public i As Integer
    Public d As Double

    ReadOnly Property GetNum()
      Get
        Return i
      End Get
    End Property
  End Structure

  Public Data As strc
  Public cls As Object
End Module
'------------------------------------------------------------------
Public Class Form1

  Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click

    Select ComboBox1.SelectedIndex
      Case 0
        cls = New Class1
      Case 1
        cls = New Class2
    End Select

    Debug.Print(cls.GetData())
  End Sub

End Class
'------------------------------------------------------------------

ところが、クラス内のFunctionプロシージャの所で、「'd' は型 'Module1.strc'
を class 'Class1' 経由でプロジェクトの外側に公開できません。」というエラ
ーが出てしまいます。MSDNによるとアクセスレベルが違う為に起こると書いてあ
るのですが、どちらもPublicなので問題ないと思うのですが何が違うのでしょう。

FunctionをFriendにするとエラーは出なくなりますが、今度は実行時に
MissingMemberExceptionが出てしまいました。根本的に考え方が間違っているの
か、単に宣言の仕方が悪いのか判りません。どうしたらいいのか、ご指導下さい
Module1 自体が Public になってませんね。
http://msdn.microsoft.com/ja-jp/library/aaxss7da.aspx
Module の既定のアクセスレベルを確認してください。

// プロパティが外部非公開でフィールドは Public とか意味が分かりませんが……。
// わざわざ Structure を Module 内で定義する意味も……。
Hongliang さん、ご回答ありがとうございます。

ModuleはデフォルトでFriendになるのですね。知らなかった...
勉強になりました。

これで解決済みにしますが、

// わざわざ Structure を Module 内で定義する意味も……。

は、一般的にはどうするのでしょうか?
このStructureは複数のクラスで共通で使うので、Public宣言する為に別モジュ
ールで定義しているのですが...。

※言い忘れましたが、掲載したプログラムは実際に動かしている物を要約した
ものです。
解決済み!
2009/03/10(Tue) 12:41:46 編集(投稿者)

> // わざわざ Structure を Module 内で定義する意味も……。
>
> は、一般的にはどうするのでしょうか?
> このStructureは複数のクラスで共通で使うので、Public宣言する為に別モジュ
> ールで定義しているのですが...。

StructureはClassやModuleと同レベルのものなので、
Moduleの中に書く必要がない(Moduleの外でよい)という意味かと思います。
解決済み!

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