c#工厂方法和保护级别问题

本文关键字:别问 问题 保护 工厂 方法 | 更新日期: 2023-09-27 18:00:26

我有一个基类和从该基类派生的几个子类。我在基类中还有一个静态函数,它接受一些参数,并根据输入参数实例化和返回一个适当的子类(我的工厂方法)

现在我的问题是:我只想允许从工厂方法实例化子类。但是,如果我将子类的构造函数设置为受保护,基类就看不到它们。我是否缺少一个访问修饰符,它允许基类调用子类构造函数,但不允许任何其他类调用它们?

内部看起来也不起作用。。。我想将对子类构造函数的访问限制在基类,同一程序集中还有其他类应该能够访问基工厂方法,但不能直接实例化任何子类。

希望我错过了一些非常简单的东西。。。

示例:

public class Base
{
    public Base CreateChild(string childType)
    {
        if(childType == "A")
            return new ChildA();
        if(childType == "B")
            return new ChildB();
        return null;
    }
}
public class ChildA
{
    protected ChildA() // This doesn't work, since now base class can't call this!
    {
    }
}
public class ChildB
{
    protected ChildB()
    {
    }
}

c#工厂方法和保护级别问题

您可以在Base 中将子类声明为私有嵌套类

您是否尝试过在基类中声明子类?

public class Base {
    protected class ChildA {}
    protected class ChildB {}
}

如果通过类型访问任何派生的对象是一种有效的方案(假设衍生的type只覆盖基础实现,而不添加新功能),那么使导出的

如果不是这样的话,那么我认为你陷入了一个不合理的

复杂性的案例。来自同一程序集的代码无法访问ChildAChildB构造函数的原因是什么?毕竟,你可以控制所有的代码,所以你总是可以选择通过代码审查来进行/强制执行,即通过工厂方法进行初始化。

我知道有充分的理由不让外部程序集自由实例化对象,除非通过严格控制的机制。在这种情况下,只需将构造函数标记为internal即可

否则,我不确定你是否可以在不为这个类及其派生类创建特定程序集的情况下实现你所假装的。绝对没有访问修饰符会使派生的类中的静态方法只能从其类别中可见。