为什么oop语言不支持单独的访问修饰符进行读写?

时间:2011-05-14 12:40:14

标签: oop language-design design-principles

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

吸气剂和定位器是引擎盖下的功能。并且调用函数较慢而不仅仅是设置字段,因为您需要复制参数,推送和弹出堆栈帧,复制结果等。

好吧,编译器可以优化函数调用并内联赋值,但这是你无法控制的。即使是c ++中的inline关键字也只是一个提示,编译器可以自由地忽略它。你应该假设一个函数被调用,它会慢一些。

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

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

1 个答案:

答案 0 :(得分:5)

但是可以在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,这是一种专门针对常见情况的语言(“公共”getter,“私有”设置器),允许您声明属性readonly然后重新声明它readwrite类扩展或子类。

您还有其他语言吗?