为什么oop语言没有'只读'访问修饰符?

时间:2010-07-17 11:04:09

标签: oop programming-languages

每次我写一些琐碎的getter(得到只返回成员值的函数)我想知道为什么oop语言没有一个'只读'访问修饰符,它将允许读取对象成员的值但是不允许你像c ++中的const一样设置它们。

私有,受保护的公共访问修饰符为您提供完整(读/写)访问权限或无访问权限。

每次编写一个getter并调用它都很慢,因为函数调用比访问一个成员要慢。一个好的优化器可以优化这些getter调用,但这是“神奇的”。我不认为学习某个编译器的优化器如何工作并编写代码来利用它是个好主意。

那么为什么我们需要编写访问器,只读一个新的访问修饰符就可以实现在实践中随处可读的接口?

ps1:请不要说'它会破坏封装'之类的东西。公开foo.getX()和公开但只读foo.x会做同样的事情。

编辑:我没有明确表达我的帖子。抱歉。我的意思是你可以在外面阅读会员的价值,但你无法设定它。您只能在类范围内设置其值。

9 个答案:

答案 0 :(得分:11)

您通常会错误地将一种或多种OOP语言概括为OOP语言。一些实现只读属性的语言示例:

  • C#(谢谢,Darin和tonio)
  • Delphi(= Object Pascal)
  • 红宝石
  • Scala的
  • Objective-C(谢谢,Rano)
  • ...更多?

就个人而言,我很生气,Java没有这个(但是?)。看过其他语言的功能后,用Java编写样板文件似乎很无聊。

答案 1 :(得分:9)

some OOP languages do have这样的修饰符。

答案 2 :(得分:5)

在C#中,您可以在集合上定义具有不同访问限定符的自动属性并获取:

public int Foo { get; private set; }

这样,类实现可以修改属性到其内容,而客户端代码只能读取它。

答案 3 :(得分:2)

C#有readonly,Java和其他一些有final。您可以使用它们将成员变量设置为只读。

在C#中,您只需为您的属性指定一个getter,这样它就只能被读取,而不能被更改。

private int _foo;

public int Foo
{
    get { return _foo; }
}

答案 4 :(得分:2)

实际上,不是他们不一样。公共foo.getX()仍然允许内部类代码写入变量。对于内部类代码,只读foo.x也是只读的。

有些语言确实有这样的修饰语。

答案 5 :(得分:0)

C#属性允许轻松定义只读属性。请参阅此article

答案 6 :(得分:0)

答案 7 :(得分:0)

在德尔福:

strict private
  FAnswer: integer;
public
  property Answer: integer read FAnswer;

声明一个只读属性访问私有字段FAnswer的答案。

答案 8 :(得分:0)

这个问题很大程度上归结为:为什么不是每种语言都有像C ++这样的const属性?

这就是它不在C#中的原因:

  

Anders Hejlsberg:是的。关于   const,这很有意思,因为我们   也一直听到这个抱怨:   “为什么你没有const?”含蓄   在问题是,“你为什么不   有const由强制执行   运行时?“那真是人   正在问,虽然他们不来   出去说那样。

     

const在C ++中工作的原因是   因为你可以扔掉它如果你   无法抛弃它,然后是你的世界   会很糟糕如果您声明一个方法   需要一个const Bla,你可以通过   它是一个非常规的Bla。但如果是的话   你的其他方式不能。如果你   声明一个采用a的方法   非const Bla,你不能传递它   const Bla。所以现在你被卡住了。那么你   逐渐需要一个const版本   一切都不是常数,而你   结束了阴影世界。在C ++中你   侥幸逃脱,因为和   C ++中的任何东西都是纯粹可选的   你是否想要这个检查。   你可以打破常量   如果你不喜欢它。

请参阅:http://www.artima.com/intv/choicesP.html

因此,wy const在C ++中工作的原因是因为你可以解决它。这对C ++来说是明智的,它源于C语言。

对于像Java和C#这样的托管语言,用户会希望const和垃圾收集器一样安全。这也意味着你无法解决它,如果你不能解决它就没有用。