我知道标题有点长,所以这是我的问题。 我举了这个课,例如:
public class Connection
{
public static Connection Create()
{
return new Connection();
}
}
我需要确保只能由其他类创建Connection的新实例,并调用Create方法。解决方案必须允许类从Connection继承。
我发现的一些答案是制作课程abstract
或static
但是我记得,你不能创建抽象或静态类的实例,也不能继承静态
另外两个提供的答案是创建Connection类的private
或protected
构造函数。好吧,如果构造函数设置为private,我们不能从派生类中调用它,但是如果它受到保护,我们可以。
所以,我的想法是构建构造函数protected
。我是对的吗?因为我发现有人发布使Connection类静态是正确的答案,这没有任何意义。
答案 0 :(得分:2)
由于您在问题中列出的原因,static
和abstract
都已出局。让其他类继承自己的类,同时禁止直接实例化的方法是创建构造函数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)
如果在主类中将其创建为子类,请将构造函数设置为采用在主类内部生成的参数,并使用主类中的私有方法进行验证。
这样,没有外部类可以在不抛出异常的情况下实例化子类。