限制子类中的访问属性

本文关键字:访问 属性 子类 | 更新日期: 2023-09-27 17:54:23

我有一个具有公共属性的类,我想限制对_for_some_modules_的访问。(使用这个类的模块位于不同的程序集中,所以internal没有帮助。)

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

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

限制子类中的访问属性

您可以使用InternalsVisibleToAttribute使类的internal成员对其他程序集(如您所愿)可见。文档页面有一个示例:

我认为这是一个常见的任务更受限制的类变体?

这不是一个常见的任务,因为它违反了Liskov替换原则——对于你限制访问的属性,你不能像使用基类那样使用子类。你应该考虑重构你的类层次结构。

您可以通过组合来解决这个问题-使A类仅在内部,并编写一个具有A类型成员的公共包装器类,并委托和控制对A属性/方法的访问。

创建更多受限制的子类实际上并不常见,因为这会破坏基类的消费者假设他们可以访问公共成员的情况。一般来说,你的类应该开始是限制性的,然后随着它们的专门化而变得更少,而不是相反。

你正在寻找的概念在其他语言中被称为"朋友"类,但c#(故意)没有实现它们。internalsvisibletoattribute是最接近的,但它是在程序集级别应用的,所以它可能不适合您。

如果没有更多关于为什么要以这种方式限制访问的信息,就很难给出任何好的通用替代方案。像public/private/etc这样的访问修饰符并不是为了安全机制而设计的,因为无论如何反射都会让你读取/写入所有内容。它们更多的是提示消费者使用什么是安全的——公共成员通常在新版本中保持稳定,而私有(实现细节)成员更有可能发生变化。

你可以这样做:

class MyBaseClass
{
    protected string MyRestrictedProperty { get; set; }
}
class MyClass : MyBaseClass
{
    public string MyPublicProperty 
    {
        get { return MyRestrictedProperty;  }
        set { MyRestrictedProperty = value; }
    }
}