2

正しいクラス修飾子を学ぶために率先して取り組んだことはありません。なぜなら、それは常に「持っているのはいい」でしたが、「持っている必要がある」というわけではないからです。

それは私ができることを私に苛立たせますDim F as New Person.FavoriteFoodsList

PersonクラスがFavoriteFoodsListを利用できるように、どのクラス修飾子を使用しますが、Personの外部ではFavoriteFoodsListをインスタンス化できませんか?

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim P As New Person
    P.FavoriteFoods.Add("Pizza")
    Dim F As New Person.FavoriteFoodsList 'How do I prevent this
End Sub
Public Class Person
    Public FavoriteFoods As New FavoriteFoodsList
    Public Class FavoriteFoodsList
        Inherits Collections.Generic.List(Of String)
    End Class
End Class
4

3 に答える 3

2

クラスのパブリックインターフェイスを定義してから、実装をプライベートとしてマークすることをお勧めします。

Public Interface IFavoriteFoodsList
    Inherits Collections.Generic.IList(Of String)
    ' Define other public api methods'
End Interface

Public Class Person
    Public FavoriteFoods As IFavoriteFoodsList = New FavoriteFoodsList
    Private Class FavoriteFoodsList
        Inherits Collections.Generic.List(Of String)
        Implements IFavoriteFoodsList
    End Class
End Class
于 2012-07-20T22:10:45.733 に答える
2

EDIT 3:以下のパターンをプライベート/保護されたメンバーに適用しようとしたこの回答の以前のバージョンを削除しました:

これがアセンブリの境界を越えてどのように機能するかを説明するために、次の例を示します。

public class Person
{
    public abstract class FavoriteFoodsList : List<string>
    {
        //internal constructor prevents types in other assemblies from inheriting
        internal FavoriteFoodsList(){}
    }
    private class FFL2 : FavoriteFoodsList
    {
    }
    public FavoriteFoodsList FavoriteFoods = new FFL2();
}

免責事項、これはアクセシビリティの問題を説明するための単なるスケッチです。フィールドはプロパティなどである必要があります。

于 2012-07-20T22:05:17.527 に答える
0

1 つのアセンブリ内でこれを実現できるクラス修飾子やアクセシビリティ修飾子はありません。他の回答者が言ったように、プライベート実装クラスとのインターフェースがおそらく最良の解決策です。

ただし、クラス ライブラリを作成している場合は、FavoriteFoodsList のすべてのコンストラクターをinternal( FriendVB では、私が思うに) として宣言できます。これにより、他のアセンブリが独自の FavoriteFoodsList オブジェクトを構築できなくなります。

于 2012-07-20T22:19:33.753 に答える