C#/。强制执行(或者只是'暗示开发者')一个类方法只能从另一个特定类调用?

时间:2010-11-11 16:29:16

标签: c# .net

我正在进行一些内部特定于域的库开发,顺便说一句,我正在尝试模拟“类”和“对象”关系的相当好的东西。因此,对于我的C#类 MyObject 的对象,我的C#类 MyClass 的对象应该像域特定类那样扮演< em> object 或 instance 。现在我希望 MyObject 中的代码能够访问 MyClass 的方法,这些方法不应该被项目中的其他类/代码访问。任何想法如何强制执行这一点,并希望记录它,希望我的同事们都会尊重这一点。

我希望我的问题足够清楚,否则请告诉我。

祝你好运!

5 个答案:

答案 0 :(得分:3)

您可以随时将MyClassMyObject分成另一个项目,并将MyClass和/或MyObject定义为internal类。这样它只能被该程序集中的其他对象访问。

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

答案 1 :(得分:3)

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

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

你不必如此严格地采取'别的',这两个类可以与其他相关的类共享一个程序集。然后,您必须在该库中手动验证无访问规则。

答案 2 :(得分:2)

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

  

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

答案 3 :(得分:1)

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

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

例如:

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。

答案 4 :(得分:1)

Pehaps你的MyObject应该从MyClass下载,并将MyClas中的方法声明为protected。