除非通过工厂,否则禁止访问派生类

本文关键字:禁止 访问 派生 工厂 | 更新日期: 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) {}
}

我想向世界其他地方隐藏BottomABottomB的实现(包括同一程序集中不相关的类)。因此它们仅通过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) {}
    }
}
  1. 您可以将构造函数设为内部构造函数,因此只有工厂类才能调用它
  2. 您可以将整个类设置为工厂类的私有类。以下是后者的一个示例:http://code.msdn.microsoft.com/Samples-for-Parallel-b4b76364/sourcecode?fileId=44488&路径Id=1696822056

您选择做什么,完全取决于您希望制作vfisibel的内容和希望隐藏的内容。