【问题标题】:Why oop languages don't support separate access modifiers for reading and writing?为什么 oop 语言不支持单独的读写访问修饰符?
【发布时间】:2011-05-14 12:40:13
【问题描述】:

我经常发现自己编写 getter 和 setter 只是因为获取和设置需要不同的访问级别。而那些getter和setter都是微不足道的(getter只返回,setter只设置值,里面没有其他代码)。当您希望字段值对外部世界只读时的典型情况(并且您为每个字段编写了一大堆 getter 函数。)

Getter 和 setter 是底层的函数。而且调用函数比仅仅设置一个字段要慢,因为你需要复制参数、推送和弹出堆栈帧、复制结果等。

好吧,编译器可能会优化函数调用并内联赋值,但这是您无法控制的事情。甚至 c++ 中的 inline 关键字也只是一个提示,编译器可以随意忽略它。您应该假设调用了一个函数并且它会变慢。

此外,从来没有语言(如 C#)支持属性并模仿这个东西,但它们只不过是看起来像一个字段的函数,你甚至无法分辨它是一个函数还是一个字段(没有 IDE 的帮助)。

如果我们可以为写入和读取设置不同的访问修饰符(例如像文件系统那样),而不只是告诉它会违反封装的教条原则,会出现什么问题?

【问题讨论】:

  • (应该是社区wiki,但我没找到在哪里可以设置。)
  • 与干扰多态性有关,但我不能把它放在一个足够连贯的答案中。
  • 他们确实支持这一点。他们只是根据称为 property 的特殊方法来实现它。

标签: oop language-design design-principles


【解决方案1】:

但是您可以在 C# 中为 getter 和 setter 创建具有不同访问权限的属性:

public int Foo {
    get { return foo; }
    protected set { foo = value; }
}

protected int Bar { get; private set; }

第一个创建一个带有公共 getter 和一个受保护 setter 的属性“Foo”,而第二个创建一个带有一个受保护 getter 和一个私有 setter 的属性“Bar”。

至于 Objective-C,专门针对常见情况的语言(“public”getter,“private”setter)允许您声明一个属性 readonly,然后在类扩展中重新声明它 readwrite 或子类。

您还想到了哪些其他语言?

【讨论】:

  • 希望编译器可以内联这些属性。
猜你喜欢
  • 1970-01-01
  • 2011-05-15
  • 2011-04-12
  • 1970-01-01
  • 2014-09-14
  • 1970-01-01
  • 1970-01-01
  • 2014-06-09
  • 2015-11-26
相关资源
最近更新 更多