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

クラスモジュールの宣言の仕方?

環境/言語:[環境 XP、使用言語 VB.NET、.NET Frameworkのバージョン 1.1]
分類:[.NET]

下記のような、EXEとDLLの関係で、DLL側のClass2は、EXE側で直接参照できないようにしたいのですが、
EXE側で 「Private C2 As New ClassLibrary.Class2」 とすることが可能でこれを不可にしたいです。
そこで Class2の宣言を、「Friend Class Class2」とすると、今度は Public Cls2 As New Class2 のところで
「'Cls2' は、Public Class 'Class1'の外にある Friend 型を公開できません。」とエラーなってしまいます。
http://dobon.net/vb/dotnet/beginner/accessibilitylevel.html ここを読むと、Protected + Friend にすれば
よさそうなのですが、クラスモジュールを Protected では宣言できないみたいです。
要は、Class2はClass1の子というような関係で、EXE側に公開したいのですが...よろしくお願い致します。


[EXE]
    Private Cls1 As New ClassLibrary.Class1
    Private X As Integer

        X = Cls1.Cls2.Test

[DLL]
Namespace ClassLibrary
(Class1)
    Public Class Class1
        Public Cls2 As New Class2

(Class2)
    Public Class Class2
        Public Function Test() As Integer
> Cls1.Cls2.Test
って時点で、アクセスするのに深いだけで、直接参照したい、という意味になっていると思うのですが。
Class1の子としてでも何でも、直接外側からアクセスすることがあるのであれば、
Class2型の構造が外から見えなければならないので隠蔽はできないと思います。
ほんとうに直接参照したくない、という場合、
Class2のメンバのうちの公開したいものへアクセスできるプロパティを
Class1のメンバに作るという委譲関係を作って、やたら好き勝手アクセスでき
ないようにする必要があるのでは、とは思いますが。


ということで、勝手に曲解して、
「
   (Cls1.Cls2.Testという形で)直接アクセスはしたいけど
   DLL側以外からは新たに好き勝手Newができないようにする
」
という扱いで十分だということであれば、
Class2のFriendコンストラクタを作ることで対応できます。
これで、Class2自体は他で使用できますが、DLLの外からはNewできないようになります。
'●クラス1
Public Class Class1
    Public c2 As New Class2
End Class
'●クラス2
Public Class Class2
    Friend Sub New()

    End Sub
    Public a As String = "aaaaa"
End Class

でも並列だと人間が見た場合微妙なので、以下のようにするといいかもしれません。
Class2型自体がClass1.Class2という位置になって、人間に分かりやすいかな。
機能は一緒です。
'●クラス1
Public Class Class1
    Public c2 As New Class2

    '●クラス2。インナーに。
    Public Class Class2
        Friend Sub New()
    
        End Sub
        Public a As String = "aaaaa"
    End Class
End Class

こんな感じ?
・・・う〜ん、なんとも。
(だめですか?)
こど。さんありがとうございます。

System.Drawing(名前空間)みたいな次のような関係にできないかなと思ったのですが、
この場合の "Drawing"はただの名前空間ですよね。

System.Drawing.Bitmap.FromFile(FileName)
System.Drawing.Image.FromFile(FileName)

下記のように 上の"Drawing"に相当する"MyDrawing"はクラスとしたかったのですが...

[DLL]
Namespace MySystem
(Class1)
  Public Class MyDrawing
    Public MyBitmap As New Class2
    Public MyImage As New Class3

(Class2)
  Public Class Class2
        Public Function FromFile(ByVal filename As String) As Integer
           :
           :

  Public Class Class3
        Public Function FromFile(ByVal filename As String) As Integer
           :
           :
2005/02/06(Sun) 22:29:35 編集(投稿者)
2005/02/06(Sun) 22:29:16 編集(投稿者)

<pre><pre>(書き直しました)

それは、
MyDrawingに、MyBitmap、MyImageという名前のClas2型、Class3型のメンバフィールドが欲しいわけではなく
MyDrawing.MyBitmapやMyDrawing.MyImageといった位置づけのMyBitmap型やMyImage型が欲しいんですよね。

それであれば、先ほどの私の書き込みで言うところの、
二つ目の形になっていればそのような構造になりますから、
具体的には、
Class2やClass3はMyDrawingクラスの外ではなく中に、それぞれクラス名をMyBitmap、MyImageとして、
Javaのインナークラス的に宣言すればよいです。
</pre></pre>
> それであれば、先ほどの私の書き込みで言うところの、
> 二つ目の形になっていればそのような構造になりますから、
> 具体的には、
> Class2やClass3はMyDrawingクラスの外ではなく中に、それぞれクラス名をMyBitmap、MyImageとして、
> Javaのインナークラス的に宣言すればよいです。

こど。さんの仰る方法で「インナークラス」にしてみたら解決できました。ありがとうございました。
解決済み!

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