0

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

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. 这看起来很简单,但我一直无法找到正确的访问器组合来做到这一点。

编辑:

很多人都指出我可以将所有东西都放在内部,但是在同一个程序集中隐藏类是一个关键要求,所以这并不能解决它。

4

3 回答 3

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) {}
    }
}
于 2013-06-25T21:49:16.070 回答
2

我会为其他类定义一个接口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) {}
    }
}
于 2013-06-25T21:46:47.587 回答
0
  1. 您可以将构造函数设为内部,因此只有工厂类可以调用它。
  2. 您可以将整个类设为工厂类的私有。这是后者的一个示例:http ://code.msdn.microsoft.com/Samples-for-Parallel-b4b76364/sourcecode?fileId=44488&pathId=1696822056 。

您选择做什么,完全取决于您希望制作什么 vfisibel 以及您希望隐藏什么。

于 2013-06-25T21:47:01.777 回答