使 类 只能由静态对象访问

Make classes accessible only by static object

我正在 .Net 中创建一个库

我有一个名为 DataManager 的静态 class。

public static class NewDataManager
{
    public static Soccer Soccer { get; private set; }

    static NewDataManager()
    {
         Soccer =  new Classes.Soccer.Soccer();
    }
}

足球 class 就像:

public class Soccer
{
    public static Mapping.Mapping Mappings { get; private set; }

    public Soccer()
    {
        Mappings = new Mapping.Mapping();
    }
}

而映射 class 只是另一个 public 空 class。

当我在另一个项目中使用这个项目作为参考时,我可以像

一样访问我的对象
NewDataManager.Soccer.Mappings

很好,这就是我想要的。问题是,我可以初始化引用项目中的所有 classes

var s = new Soccer();
var m = new Mapping();

我希望那些 classes 只能通过我的 NewDataManager class 访问,使用我的库的项目应该无法初始化 classes。

我该如何限制它?

因为 类 是 public - 您可以从 "anywhere"

访问它们

public

The type or member can be accessed by any other code in the same assembly or another assembly that references it.

私人

The type or member can be accessed only by code in the same class or struct.

受保护

The type or member can be accessed only by code in the same class or struct, or in a class that is derived from that class.

内部

The type or member can be accessed by any code in the same assembly, but not from another assembly.

MSDN article about access modifiers

让我扩展 VisualBean 的解决方案: 类 具有可访问性特征,就像函数一样,正如他所描述的那样 - public、私有、受保护、内部等

所以第一个解决方案就是在同一个程序集中定义 NewDataManager 和 Soccer classes,并使 Soccer 和 NewDataManager public 成为内部的,如下所示:

public class NewDataManager{/*Your code goes here*/}
internal class Soccer{/*Your code goes here, 2*/}

然后在另一个文件中,您可以放置​​其余代码。

不过,还有一些可能更合适的选择(取决于您的情况)。如果一个 class 只能被另一个 class 的单一类型访问,恕我直言,它应该与那个 class 相关。为了在 classes 中包含 classes,您有两种方法:

要么使构造函数受保护,要么使 class 继承另一个 class(如果对象相互扩展,这是一个很好的解决方案), 即

class Soccer{protected Soccer(){} /*Rest of the code goes here*/}
class NewDataManager:Soccer{// NewDataManagerStuff }

或者使生成成为一个事件,要求发件人是您正在寻找的class,这可能会稍微复杂一些。

祝你好运,希望对你有所帮助。 :)

只需将 Mapping class 插入 NewDataManager 中,如下所示:

public static partial class NewDataManager 
{
    // NewDataManager class code
}

public partial class NewDataManager
{
    public static class Mapping
    {
        // Mapping class code
    }
}

public static class NewDataManager 
{
    // NewDataManager class code

    public static class Mapping
    {
        //Mapping class code
    }
}

这里有一种方法可以有效地实现您的目标。将 Soccer 嵌套在 NewDataManager 中,然后你可以这样做:

public static class NewDataManager
{
    public static ISoccer SoccerInstance { get; private set; }

    static NewDataManager()
    {
         SoccerInstance =  new Soccer();
    }

    private class Soccer : ISoccer
    {

        public Soccer()
        {
        }
    }
}

public interface ISoccer {}

嵌套 class private 意味着无法在 NewDataManger 之外访问它,但您仍然可以通过实现 public 接口来公开它.当然,您可以添加任何需要暴露给接口的属性,以便调用代码可以使用它们。我通过省略 Mapping 属性.

来简化示例

现在,如果您不想嵌套 classes,则不必这样做。您可以将它们标记为 internal 并且它们对其他程序集不可见,但它们在同一程序集中是可见的。这意味着除 NewDataManger 之外的同一程序集中的 classes 将能够看到它们(并创建新实例),但其他程序集不会。这对你来说可能就足够了。

要防止另一个程序集实例化 class,请使其构造函数 internal:

public class Soccer
{
    public static Mapping.Mapping Mappings { get; private set; }

    internal Soccer()  //  <-- instead of 'public'
    {
        Mappings = new Mapping.Mapping();
    }
}

public class Mapping
{
    internal Mapping()
    {
    }
}

(顺便说一句,您似乎有名为 SoccerMapping 的名称空间。Don't do this.