如何确保只能由其他类创建新的类实例?

时间:2015-10-24 17:31:47

标签: c# oop

我知道标题有点长,所以这是我的问题。 我举了这个课,例如:

public  class Connection
{
     public static Connection Create()
     {
          return new Connection();
     }            
}

我需要确保只能由其他类创建Connection的新实例,并调用Create方法。解决方案必须允许类从Connection继承。

我发现的一些答案是制作课程abstractstatic但是我记得,你不能创建抽象或静态类的实例,也不能继承静态

另外两个提供的答案是创建Connection类的privateprotected构造函数。好吧,如果构造函数设置为private,我们不能从派生类中调用它,但是如果它受到保护,我们可以。

所以,我的想法是构建构造函数protected。我是对的吗?因为我发现有人发布使Connection类静态是正确的答案,这没有任何意义。

2 个答案:

答案 0 :(得分:2)

由于您在问题中列出的原因,staticabstract都已出局。让其他类继承自己的类,同时禁止直接实例化的方法是创建构造函数protected。但请记住,继承类可以选择允许自己的构造函数为public,从而绕过您的保护。

但是,一般而言,应该为继承或实例化设计类,但不能同时用于这两个目的。更好的设计如下:

public abstract class Connection {
    protected Connection();
    public static Connection Create() {
        return new DefaultConnection();
    }
}
internal sealed class DefaultConnection : Connection {
    public DefaultConnection() {
        ...
    }
}

来自外部的类可以继承Connection,但是它们无法实例化它,因为它是abstract。另一方面,您的代码可以创建DefaultConnection的实例,这些实例对其他所有人都是隐藏的,因为它是internal

答案 1 :(得分:0)

如果在主类中将其创建为子类,请将构造函数设置为采用在主类内部生成的参数,并使用主类中的私有方法进行验证。

这样,没有外部类可以在不抛出异常的情况下实例化子类。