我正在进行一些内部特定于域的库开发,顺便说一句,我正在尝试模拟“类”和“对象”关系的相当好的东西。因此,对于我的C#类 MyObject 的对象,我的C#类 MyClass 的对象应该像域特定类那样扮演< em> object 或 instance 。现在我希望 MyObject 中的代码能够访问 MyClass 的方法,这些方法不应该被项目中的其他类/代码访问。任何想法如何强制执行这一点,并希望记录它,希望我的同事们都会尊重这一点。
我希望我的问题足够清楚,否则请告诉我。
祝你好运!
答案 0 :(得分:3)
您可以随时将MyClass
和MyObject
分成另一个项目,并将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。