除非通过工厂,否则禁止访问派生类
本文关键字:禁止 访问 派生 工厂 | 更新日期: 2023-09-27 18:20:04
我有一个抽象类,它有一个静态工厂方法来返回它的子类:
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) {}
}
我想向世界其他地方隐藏BottomA
和BottomB
的实现(包括同一程序集中不相关的类)。因此它们仅通过CCD_ 3来访问。这看起来很简单,但我还没能找到正确的访问者组合来做这件事
编辑:
许多人指出,我可以将所有内容都设置为内部,但隐藏在同一程序集中的类是一个关键要求,因此这并不能解决问题
听起来像是一个私有内部类将解决的问题。
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) {}
}
}
我会为ITop
定义一个接口,并将"底部"其他类设置为内部类。如果希望它们对同一程序集中的其他类型"不可见",请将它们定义为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) {}
}
}
- 您可以将构造函数设为内部构造函数,因此只有工厂类才能调用它
- 您可以将整个类设置为工厂类的私有类。以下是后者的一个示例:http://code.msdn.microsoft.com/Samples-for-Parallel-b4b76364/sourcecode?fileId=44488&路径Id=1696822056
您选择做什么,完全取决于您希望制作vfisibel的内容和希望隐藏的内容。