首页 > 解决方案 > 如何让一个类负责构建另一个类

问题描述

我正在编写一个类库,其中包含一个名为Application. 该类Application包含Document对象的集合。我希望Application该类在适当的时候单独负责“创建”(构造)Document对象。我不希望我自己或我们的其他开发人员能够Document任意构造新对象。

我试图想出一些强有力的方法来强制执行这一点,但我只提出了几种可能性,它们都有缺点。

第一种方法是将Application类嵌套在类中Document,并使Document构造函数私有,以便只有Application类可以访问它。但这在结构上毫无意义,实际上与真正的关系相反。更不用说通常不鼓励公共嵌套类。

我尝试的另一种方法是将Document构造函数设为私有,但给它一个公共的“工厂方法”,它会进行一些检查以尝试确保它确实被Application. 但是当我试图实现它时,这变得非常复杂。

我是否过于复杂了?当然,构建代码库以使开发人员可以做他们不应该做的事情是很常见的事情吗?我是否应该期望我们的开发人员(和我自己)使用谨慎和常识,而不是四处构建新Document对象,而他们应该从中获取它们Application

还是我试图强制执行这一点是正确的?我是否正确地追求课程只能按预期使用?毕竟,这首先是访问级别的目的——仅在正确的上下文中强制使用实体。如果这是一个合理的追求,是否有人对在这种情况下如何做到这一点有任何建议?


注意:我发现了这个类似的线程:java - make class only instantiable from specific class。但是建议的解决方案是嵌套类,由于我上面给出的原因,这不是一个好的选择。

标签: c#.netvb.net

解决方案


有一种方法可以做到这一点,但它有点令人费解,我不会这样做......

您可以将Document实现放在单独的程序集中并制作其构造函数internal

然后将该Application类放在另一个程序集中(单独)并InternalsVisibleTo在 Document 程序集中使用,以使Document构造函数对程序集可见Application

这样,只有程序Application集或程序集中的代码Document才能构造一个Document. (当然,这可以简单地通过向Application程序集或Document创建Document...实例的程序集添加类来规避)

尽管我实际上并不希望Application该类直接创建Document. 我想Document在一个类后面进行抽象IDocument并传递一个工厂方法以Application用于创建IDocument项目。


推荐阅读