tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルクラスの公開と非公開について
記事No5449
投稿日: 2007/05/09(Wed) 14:38
投稿者ひでと
お世話になります。

今2つのクラスを作成し、Class1はClass2から継承します。
この2つのクラスを含む、ClassLibrary1をdllでビルドすることにします。
それを WindowsApplication1に参照設定すれば

Public Class Class1
    Inherits Class2
    Private newB As Integer
    Public Property B() As Integer
        Get
            Return newB
        End Get
        Set(ByVal value As Integer)
            newB = value
        End Set
    End Property
End Class

Public Class Class2
    Private newA As Integer
    Public Property A() As Integer
        Get
            Return newA
        End Get
        Set(ByVal value As Integer)
            newA = value
        End Set
    End Property
End Class

次のように利用できますが、
Public Class Form1
    Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim a As New ClassLibrary1.Class1
        a.A = 1
        a.B = 2
        Dim b As New ClassLibrary1.Class2
    End Sub
End Class

ここで「 Dim b As New ClassLibrary1.Class2 」のようにClass2も取得できてしまいます。
実際は、Class1で作業したいので、混乱を避ける為、Class2は取得できないようにしたいのですが
どのようにしたら良いのでしょうか?
よろしくお願いします。

Class2をPrivateにして、同じファイル内に記載することは考えたのですが、Class1,2ともコードが長く、別のファイルにしておきたいのです。

[ツリー表示へ]
タイトルRe: クラスの公開と非公開について
記事No5450
投稿日: 2007/05/09(Wed) 15:15
投稿者よねKEN
http://msdn2.microsoft.com/ja-jp/library/76453kax(VS.80).aspx

Friendについて調べてみましょう。

[ツリー表示へ]
タイトルRe^2: クラスの公開と非公開について
記事No5451
投稿日: 2007/05/09(Wed) 16:16
投稿者ひでと
ありがとうございます。
Friendsについてのぞいたのですが、Class1,2ともにFriendsにしないと
Inheritsが出来ないようですね。

「インターフェイスには、それ自身より厳しいアクセス レベルを持つ別のインターフェイスを継承することはできません。たとえば、Public インターフェイスは Friend インターフェイスを継承できません。」

両方をFriendsにすると、dllを参照してもClass1を取得できないようですが、
解決方法がありますでしょうか?
申し訳ありませんが、もう少しお願いします。

[ツリー表示へ]
タイトルRe^3: クラスの公開と非公開について
記事No5452
投稿日: 2007/05/09(Wed) 16:35
投稿者魔界の仮面弁士
>>> ここで「 Dim b As New ClassLibrary1.Class2 」のようにClass2も取得できてしまいます。
>> Friendについて調べてみましょう。
> Friendsについてのぞいたのですが、Class1,2ともにFriendsにしないと
> Inheritsが出来ないようですね。

DLL を利用する側が、
  Dim b As ClassLibrary1.Class2
ができてしまうという事が問題なのではなく、
  Dim b As New ClassLibrary1.Class2()
ができてしまう事が問題なのですよね?

であれば、Friend にするのはコンストラクタだけでしょう。


Public Class Class2
   Friend Sub New()
   End Sub
End Class

[ツリー表示へ]
タイトルRe^4: クラスの公開と非公開について
記事No5453
投稿日: 2007/05/09(Wed) 16:58
投稿者ひでと
ありがとうございます。

> DLL を利用する側が、
>   Dim b As ClassLibrary1.Class2
> ができてしまうという事が問題なのではなく、
>   Dim b As New ClassLibrary1.Class2()
> ができてしまう事が問題なのですよね?
>
> であれば、Friend にするのはコンストラクタだけでしょう。

namespaceで分けてはいるのですが、同名のクラスが多数必要となりまして、
実際にインスタンス(?)を作る必要があるのは1つのクラスからだけなのです。
自分で作ったクラスで迷子にならないようにと思ったのですが、
こうすれば、コードを作る時に迷子にならずにすみそうです。

>
>
> Public Class Class2
>    Friend Sub New()
>    End Sub
> End Class

Friendの使い方が、よねKEN様と、魔界の仮面弁士様のご指導で少しわかってきました。

似たようなキーワードで「Protected」とか、関係があるのか無いのか「MustInherits」
またまた、「COMクラス」だとか、用語が難しくてHelpを見ても正直よくわかりません。
まだまだ、前途多難な気がしています。
またよろしくお願いします。重ねてありがとうございました。

[ツリー表示へ]
タイトルRe^5: クラスの公開と非公開について
記事No5454
投稿日: 2007/05/09(Wed) 17:23
投稿者魔界の仮面弁士
> 実際にインスタンス(?)を作る必要があるのは1つのクラスからだけなのです。

そういう時は、Class2 を抽象クラスにするのも手かと思います。

また、Class2 を外部に見せる必要性が全くない場合には、継承は使わず、
Class1 内の Private クラスにして、委譲で利用するという方向性もあるかも。

[ツリー表示へ]
タイトルRe^6: クラスの公開と非公開について
記事No5471
投稿日: 2007/05/12(Sat) 08:54
投稿者ひでと
遅くなりまして、失礼しました。ありがとうございました。
試してみます。

> > 実際にインスタンス(?)を作る必要があるのは1つのクラスからだけなのです。
>
> そういう時は、Class2 を抽象クラスにするのも手かと思います。
>
> また、Class2 を外部に見せる必要性が全くない場合には、継承は使わず、
> Class1 内の Private クラスにして、委譲で利用するという方向性もあるかも。

[ツリー表示へ]