阻止访问除工厂之外的派生类

时间:2013-06-25 21:40:34

标签: c#

我有一个抽象类,它有一个静态工厂方法来返回它的子类:

public abstract class ITop {
    public static ITop MakeMeOne(whatever x) {
        if(x == something) {
            return BottomA(x);
        }
        else {
            return BottomB(x);
        }
    }
}

public class BottomA : ITop {
    public BottomA(whatever x) {}
}

public class BottomB : ITop {
    public BottomB(whatever x) {}
}

我想隐藏BottomABottomB来自世界其他地方的实现(包括同一程序集中不相关的类)。所以只能通过ITop访问它们。这看起来很简单,但我无法找到正确的访问器组合来实现它。

修改

各种各样的人都指出我可以把所有内容都放在内部,但是隐藏在同一个程序集中的类是一个关键要求,所以这并不能解决它。

3 个答案:

答案 0 :(得分:4)

听起来像私人内部类会解决的问题。

public abstract class ITop {
    public static ITop MakeMeOne(whatever x) {
        if(x == something) {
            return BottomA(x);
        }
        else {
            return BottomB(x);
        }
    }

    private class BottomA : ITop {
        public BottomA(whatever x) {}
    }

    private class BottomB : ITop {
        public BottomB(whatever x) {}
    }
}

答案 1 :(得分:2)

我将为ITop定义一个接口,并在其他类中设置'bottom'。如果您希望它们对同一程序集中的其他类型“隐藏”,请将它们定义为ITop内的私有嵌套类。

public interface ITop
{
}

public abstract class Top : ITop {
    public static ITop MakeMeOne(whatever x) {
        if(x == something) {
            return BottomA(x);
        }
        else {
            return BottomB(x);
        }
    }

    private class BottomA : Top {
        public BottomA(whatever x) {}
    }

    private class BottomB : Top {
        public BottomB(whatever x) {}
    }
}

答案 2 :(得分:0)

  1. 您可以将构造函数设置为内部,因此只有工厂类可以调用它。
  2. 您可以将整个类设为私有工厂类。以下是后者的示例:http://code.msdn.microsoft.com/Samples-for-Parallel-b4b76364/sourcecode?fileId=44488&pathId=1696822056
  3. 您选择做什么,取决于您想要制作的vfisibel以及您想要隐藏的内容。