限制子类中的访问属性
本文关键字:访问 属性 子类 | 更新日期: 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; }
}
}