【问题标题】:Restricting access property in subclass限制子类中的访问属性
【发布时间】:2011-05-03 19:37:41
【问题描述】:

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

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

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

【问题讨论】:

  • 我不认为这是可能的 - 一旦你越过装配边界,所有的赌注都没有了。
  • 我可以看看你的类的骨架版本吗?通常,这样的事情可以通过更刻意的设计来解决。

标签: c# properties subclass


【解决方案1】:

您可以使用InternalsVisibleToAttribute 使该类的internal 成员对其他程序集可见(任意数量)。文档页面有一个示例。

【讨论】:

    【解决方案2】:

    我认为制作一个 一个类的更受限制的变体?

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

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

    【讨论】:

      【解决方案3】:

      创建更受限制的子类实际上并不常见,因为它会破坏假设他们有权访问公共成员的基类消费者。一般来说,你的课程应该从限制开始,随着他们的专业化而减少,反之亦然。

      您正在寻找的概念在其他语言中称为“朋友”类,但 C#(故意)没有实现它们。 InternalsVisibleToAttribte 尽可能接近,但这是在程序集级别应用的,因此它可能不适合您。

      如果没有更多信息说明您为何尝试以这种方式限制访问,就很难给出任何好的通用替代方案。像 public/private/etc 这样的访问修饰符并不是为了成为一种安全机制而设计的,因为反射会让你访问读/写任何东西。它们更多地是向消费者暗示什么是安全使用的——公共成员通常会在新版本中保持稳定,而私有(实施细节)成员更有可能发生变化。

      【讨论】:

      • 感谢您对不使子类更具限制性的见解(也感谢下面的 BrokenGlass)。
      • 我想要实现的是制作模型类的一个子集。 Model 类将是基类,而派生类是子集(或模型的视图)。目的是不同的消费者只会看到模型的相关部分。我想避免复制粘贴来获取子集类的相关属性。 (而且我想避免反射,因为其他开发人员可能难以理解......)
      【解决方案4】:

      你总是可以这样做:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-19
        • 2012-12-23
        • 1970-01-01
        • 1970-01-01
        • 2013-03-24
        • 2019-04-02
        相关资源
        最近更新 更多