我有一个带有公共属性的类,我想限制对_for_some_modules_的访问。 (使用此类的模块驻留在不同的程序集中,因此内部不起作用。)
我的第一个想法是子类化,并将派生属性访问器设为私有或受保护,但这是不可能的。派生属性必须具有相同的访问权限。 (见http://msdn.microsoft.com/en-us/library/75e8y5dd.aspx)
有什么建议吗?我认为制作类的更受限制的变体是一项常见的任务? 谢谢!
答案 0 :(得分:2)
您可以使用InternalsVisibleToAttribute
使该类的internal
成员对其他程序集可见(您可以随意使用)。文档页面有一个例子。
答案 1 :(得分:1)
我认为这是一个常见的任务 一个类的更受限制的变体?
这不是一项常见的任务,因为它违反了Liskov substitution principle - 您不能像使用基类来限制访问的属性一样使用子类。您应该考虑重构您的类层次结构。
您可以通过组合解决问题 - 仅将类A
设为内部并编写具有A
类型成员的公共包装类,并委派和控制对A
的访问权限的属性/方法。
答案 2 :(得分:1)
制作更多受限制的子类实际上并不常见,因为它会破坏假定他们可以访问公共成员的基类的使用者。一般来说,你的课程应该从限制性开始,因为他们专业化而不是那样,反之亦然。
您正在寻找的概念在其他语言中称为“朋友”类,但C#(故意)不实现它们。 InternalsVisibleToAttribte尽可能接近,但是它在程序集级别应用,因此它可能不适合你。
如果没有更多关于您为什么试图以这种方式限制访问的信息,很难给出任何好的通用替代方案。像public / private / etc这样的访问修饰符并不是一种安全机制,因为Reflection会让你无论如何都可以访问所有内容。它们更能暗示消费者使用什么是安全的 - 公共成员通常会在新版本中保持稳定,而私人(实施细节)成员更有可能改变。
答案 3 :(得分:0)
您可以随时执行以下操作:
class MyBaseClass
{
protected string MyRestrictedProperty { get; set; }
}
class MyClass : MyBaseClass
{
public string MyPublicProperty
{
get { return MyRestrictedProperty; }
set { MyRestrictedProperty = value; }
}
}