2011-05-03 121 views
1

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

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

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

+0

我不认为这是可能的 - 一旦你越过边界装配,全盘皆输。 – Tejs 2011-05-03 19:41:25

+0

我可以看到你的班级的骨骼版本吗?通常,这样的事情可以通过更有意的设计来解决。 – 2011-05-03 19:54:24

回答

1

我认为制定 更受限制的类变体是一项常见任务吗?

这不是一个普通的任务,因为它违反了Liskov substitution principle - 你不能使用子类以同样的方式,你会使用基类的问候你限制访问属性。你应该考虑重构你的类层次结构。

您可以通过组合来解决问题 - 仅使内部类A成为公共包装类,并写入类型为A的成员,并委派和控制对A的属性/方法的访问。

1

制定更多受限制的子类实际上并不常见,因为它会破坏假定他们可以访问公共成员的基类的消费者。一般来说,你的课程应该从限制开始,在专业化的时候减少,反之亦然。

您正在寻找的概念在其他语言中称为“朋友”类,但C#(故意)不会实现它们。 InternalsVisibleToAttribte尽可能地接近它,但是它在组件级应用,所以它可能不适合你。

没有关于您为什么试图以这种方式限制访问的更多信息,很难给出任何好的通用替代方案。像public/private /等访问修饰符并不是设计成安全机制,因为Reflection会让您访问读/写所有内容。它们更多地暗示消费者可以安全使用 - 公共成员通常在新版本中保持稳定,而私有(实现 - 细节)成员更有可能改变。

+0

感谢您的洞察力(下面还介绍了BrokenGlass),关于不让子类更具限制性。 – user736570 2011-05-04 06:39:44

+0

我想实现的是创建一个Model类的子集。 Model类是基类,派生类是子集(或模型的视图)。目的是不同的消费者只会看到该模型的相关部分。我想避免复制粘贴来获取子集类的相关属性。 (我想避免Reflection,因为对于其他开发人员可能很难理解......) – user736570 2011-05-04 06:47:45

0

你总是可以做这样的事情:

class MyBaseClass 
{ 
    protected string MyRestrictedProperty { get; set; } 
} 

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