【问题标题】:Class prefers its private members more than OOP rules?类比 OOP 规则更喜欢它的私有成员?
【发布时间】:2012-11-27 00:11:34
【问题描述】:

我有这个简单的代码:

public class A
{
  int _private=3;
  public   A (B b)
    {
        b._private=5;
    }

}

public class B:A
{
}

这段代码编译

  • 通过OOP - b 不应该提供对_private 的访问。

  • 通过私人和AA知道_private,但仍然通过b进行访问!

这是怎么回事?

【问题讨论】:

  • 嗯,BAtypeA 可以访问自己的变量...您所做的是真正的代码味道(使用继承类型的基类)。
  • @Oded:我不太会称之为代码异味——这是描述层次结构的常用模式,例如Node 类有两个子类 ParentLeaf,其中每个 Node 使用 Parent 作为对其父节点的引用。
  • @O.R.Mapper - 少数例外之一。
  • @Oded:好的,同意。那是一种常见的模式,但我真的想不出任何其他主要模式会包含这样的东西。

标签: c# .net oop access-modifiers


【解决方案1】:

private 访问修饰符允许访问声明它的类型的主体内的成员。 b 是另一个实例并不重要。它是一个A,所以在A 中声明的方法可以访问_private。我还要注意,这个示例或多或少直接来自 C# 4.0 规范,关于可访问域的第 3.5.2 节:

class A
{
   int x;

   static void F(B b) {
      b.x = 1;    // Ok
   }
}

class B: A
{
   static void F(B b) {
      b.x = 1;    // Error, x not accessible
   }
}

我认为 OOP 对信息隐藏的建议是关于指定客户端代码的合同。公共是受支持的东西。 Private 是一个实现细节。在这里,我们可以通过删除_private 来修改A 的实现,客户端代码将不受影响。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-22
    • 2023-02-08
    • 1970-01-01
    • 2010-12-14
    • 2019-09-18
    相关资源
    最近更新 更多