【问题标题】:Restrict object's creation限制对象的创建
【发布时间】:2012-06-19 04:08:14
【问题描述】:

我在这里有一个非常奇怪的问题。我有A类,B类和C类。我想创建B类的对象,它可以创建A类的对象。但是如何限制C类创建A类的对象。

一种方法是在Class B里面定义Class A,这样只有Class B可以创建Class A的实例,Class C不能访问Class A。

但是,我认为嵌套是一种错误的方式。

我们有什么方法可以限制对象的创建吗?是否可以使用属性和反射来帮助限制?如果可能的话有推荐的方法吗?

请分享您的想法。提前致谢。

【问题讨论】:

  • 如果设计上只有类B可以访问类A,嵌套是一个很好的解决方案。您对此有何不满意?
  • 在Real Word中,A类和B类的目的有两个不同的目的。当我们在 B 中定义 A 时,那么 B 的责任不仅是拥有 A 类,而且还具有最初的目的。是不是违反了SRP。谢谢。
  • 拥有A级并不意味着维护它。 A 类仍然像以前一样自给自足。 唯一改变的是A类accessibility。那是 architecture 问题,而不是 OOP,imo。
  • 好的。但是,只是为了可访问性,这是在 B 中定义 A 的好方法吗?谢谢

标签: c# .net instantiation encapsulation access-modifiers


【解决方案1】:

您可以将 A 类和 B 类放在一个程序集中,并将 A 类的构造函数标记为内部。

这样,只有该程序集中的类才能创建 A 类的实例。

【讨论】:

  • 感谢您的回答。但是我所有的课程都在同一个程序集中。
  • 没有其他可能的解决方案。在 C# 中,没有 C++ 的“朋友”概念。
【解决方案2】:

您可以将构造函数设为私有,并创建返回A实例的fabric方法,该方法中的参数将是B的实例。

public class A
{
  private A (){}

    public static Instance(B BInstance)
    {
       A result = null;
       if (BInstance != null)
       {
         result = new A(); 
         //create here 
       }

       return result;

    }


    }

【讨论】:

  • 这种方式 B 不会创建 A 的实例。您只是检查是否存在 B。
  • 谢谢 Aexandr 和 Erno。这是一个很好的解决方案。但是,欺骗系统的方法很少。一种方法是: Class C { pubic void SomeMethod() { B b = new B(); A a=A.Instance(b) } } 您对在 B 类中定义 A 类有何看法?不违反单一责任原则。
猜你喜欢
  • 2011-12-13
  • 2017-09-05
  • 1970-01-01
  • 2011-01-22
  • 1970-01-01
  • 2013-08-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多