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

编辑 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 回答
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 回答
0

没有类修饰符或可访问性修饰符可以让您在一个程序集中完成此操作。正如其他回答者所说,具有私有实现类的接口可能是最好的解决方案。

但是,如果您正在编写类库,则可以将所有 FavoriteFoodsList 的构造函数声明为internalFriend我认为在 VB 中),这将阻止其他程序集构造它们自己的 FavoriteFoodsList 对象。

于 2012-07-20T22:19:33.753 回答