【问题标题】:Prevent access to constructor / only specific class has access [duplicate]防止访问构造函数/只有特定的类可以访问[重复]
【发布时间】:2018-05-20 13:21:18
【问题描述】:

假设我有一个Apple Class 和一个AppleFactoryClass。 没有人应该能够使用Apple redApple = new Apple()。相反,只能从AppleFactory.Create() 创建新的 Apple。

这意味着除了 AppleFactory 类之外的所有人都无法访问 Apple 的构造函数。

如何做到这一点?

编辑:Apple 更像是AppleModel。所以那里只有属性。

【问题讨论】:

  • 您正在寻找类似于 C++ 中的朋友关系的东西,这在 C# 中不可用。如果我可以提供意见,你不应该担心这个。如果将来有人想自己创建一个 Apple 实例,那么这是他们的问题,而不是你的问题

标签: c# .net architecture software-design


【解决方案1】:

您可以将Apple 抽象化,然后在AppleFactory 中创建private 子类。

但是,您不能阻止其他人创建自己的子类。

【讨论】:

    【解决方案2】:

    如果你想让不同的类型充当工厂,那么你能得到的最接近的是internal:

    public sealed class Apple() {
        internal Apple() {} 
    }
    public class AppleFactory() {
        public Apple CreateApple() => new Apple();
    }
    

    但是,如果您可以将工厂作为 Apple 上的静态方法,那么您可以保留 private 上的所有内容:

    public sealed class Apple() {
        private Apple() {} 
        public static Apple Create() => new Apple();
    }
    

    【讨论】:

    • 问题是苹果更像是一个AppleModel。所以那里只有属性,没有真正的逻辑。我宁愿不把工厂放在苹果内部。
    • @Thypari 我听到了;我只是告诉你选项是什么 :) 注意 - 如果这个 Apple 来自代码生成工具:partial class 可能会有所帮助 - 允许你在单独的文件中向类添加功能。同样:扩展方法。
    【解决方案3】:

    您可以让Apple 类成为它自己的工厂。

    public class Apple
    {
        private Apple()
        {}
    
        internal static Apple Create()
        {
            var apple = new Apple();
            // TODO: Initialize
            return apple;
        }
    }
    

    真正的苹果工厂然后可以调用这个工厂方法:

    public class AppleFactory() {
        public CreateApple() => Apple.Create();
    }
    

    通过将Apple.Create() 设为内部,您可以将其使用限制在当前程序集中。构造函数只能调用insde Apple anway,因为它是private

    【讨论】:

    • 问题是苹果更像是一个AppleModel。所以那里只有属性,没有真正的逻辑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-28
    • 1970-01-01
    • 1970-01-01
    • 2021-04-17
    • 1970-01-01
    相关资源
    最近更新 更多