代码之家  ›  专栏  ›  技术社区  ›  S.C. Madsen

C#/.Net强制(或者只是“向其他开发人员提示”)类方法只能从另一个特定类调用?

  •  0
  • S.C. Madsen  · 技术社区  · 14 年前

    我目前正在做一些内部领域特定的库开发,顺便说一下,我试图建模的东西很好地模拟了“类”和“对象”关系。所以我的C类物品 类名 应该表现得像 域特定类 我的C类物品 肌体 他们扮演的角色 对象 实例 . 现在我想输入密码 肌体 访问方法 类名 ,项目中的其他类/代码不应访问该类。任何想法,如何执行这一点,从记录下来,希望我的开发伙伴会尊重这一点。

    我希望我的问题说得够清楚,否则就告诉我。

    谨致问候!

    5 回复  |  直到 14 年前
        1
  •  3
  •   Justin Ethier    14 年前

    你总是可以分开 MyClass MyObject 进入另一个项目,并定义 类名 和/或 肌体 作为 internal 上课。这样,它只能被该程序集中的其他对象访问。

    见: http://msdn.microsoft.com/en-us/library/7c5ka91b(VS.80).aspx

        2
  •  3
  •   Henk Holterman    14 年前

    这里的标准方法是声明成员 internal 并确保MyClass和MyObject是同一程序集的一部分。该程序集应该不包含其他内容。

    附加:这是为这个目的而设计的工具。其他语言还有其他方法来调整可访问性(C++): friend )但是在.NET中,选择了一个更简单的模型。

    而且您不必如此严格地接受“无其他内容”,这两个类可以与其他相关类共享程序集。然后,必须在该库中手动验证禁止访问规则。

        3
  •  2
  •   spender    14 年前

    我建议 private nested class . 这样,即使您的开发伙伴正在同一个名称空间中编写代码,他们也永远无法访问该类。

    一旦类声明完全包含在另一个类声明中,则认为该类是嵌套的,并且只能通过包含的类访问。

        4
  •  1
  •   Kell    14 年前

    Pehaps您的MyObject应该从MyClass派生,并声明MyClas中的方法受保护。

        5
  •  1
  •   Marnix van Valen    14 年前

    如果不希望用户调用特定于实现的方法,可以尝试抽象到接口或抽象基类。这样消费者只会“看到”您希望他们看到的属性和方法。

    您不必使用继承来提供共享功能,也不必依赖成员可访问性来防止其他人使用您不想公开的方法。

    例如:

    public interface IDomainSpecific
    {
       void DoStuff();
    } 
    
    public interface IDomainService
    {
       void HelpMeDoStuff();
    }
    
    public class DomainObject1 : IDomainSpecific
    {
      private readonly IDomainService _service;
    
      public DomainObject1( IDomainService service )
      {
        _service = service;
      }
    
      public DoStuff()
      {
        // Do domain specific stuff here 
        // and use the service to help
        _service.HelpMeDoStuff();
      }
    }

    这使用了经典的构造函数注入,当您已经在应用程序中使用依赖注入时效果最好,尽管它在工厂中也非常好。

    关键是要明确责任。任何人都不可能调用任何不应该调用的东西,因为“DomainObject”永远不知道什么具体类型实现了共享服务。共享服务也未在域对象上公开。额外的好处是可测试性,以及无需接触DomainObject就可以用另一个实现交换服务的可能性。