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

时间:2011-06-23 16:16:37

标签: c# inheritance factory protection

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

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

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

希望我有一些非常简单的东西......

示例:

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()
    {
    }
}

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

您可以将子类声明为Base

中的私有嵌套类

答案 2 :(得分:0)

如果通过 base 类型访问任何派生的对象是一个有效的场景(假设派生的类型只覆盖 base 实现并且不添加新功能)然后提出的使派生的类型嵌套private类的解决方案(如先前的答案所提出的)是最佳解决方案。

如果情况并非如此,那么我认为你会陷入不合理的复杂性的情况。同一程序集中的代码无法访问ChildAChildB构造函数的原因是什么?它是您可以控制的所有代码之后,因此您始终可以选择通过代码审查来制定/执行他的初始化是通过工厂方法。

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

否则,我不确定您是否可以在不为此基础类及其派生类创建特定程序集的情况下实现您的假装。肯定没有访问修饰符可以使派生的类中的静态方法只能从它的 base 类中看到。