限制子类中的访问属性

时间:2011-05-03 19:37:42

标签: c# properties subclass

我有一个带有公共属性的类,我想限制对_for_some_modules_的访问。 (使用此类的模块驻留在不同的程序集中,因此内部不起作用。)

我的第一个想法是子类化,并将派生属性访问器设为私有或受保护,但这是不可能的。派生属性必须具有相同的访问权限。 (见http://msdn.microsoft.com/en-us/library/75e8y5dd.aspx

有什么建议吗?我认为制作类的更受限制的变体是一项常见的任务? 谢谢!

4 个答案:

答案 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; }
    }
}