【问题标题】:Why dynamic languages don't have private member definition feature in classes (like objective c or python)? [closed]为什么动态语言在类(如目标 c 或 python)中没有私有成员定义功能? [关闭]
【发布时间】:2012-11-05 15:18:30
【问题描述】:

为什么动态语言无法在类中定义私有成员? 此功能是否存在任何实施问题?是否可以为动态语言实现此功能?

【问题讨论】:

  • 目前写的这个问题的范围很广。请考虑修改以缩小范围。
  • 很抱歉,但我认为您的问题过于模糊和过于宽泛,无法在 SO 上回答;见FAQ。如果您有更具体的问题(最好涉及一些代码),请随时询问!
  • 究竟是什么意思,你是在问为什么 Objective-C 和 Python 没有私有成员(ivars),因为他们有。
  • 我已经编辑了这个问题。希望问题足够清楚。

标签: python objective-c dynamic-languages


【解决方案1】:

这可以为动态语言实现。事实上,在 Smalltalk 中,所有成员始终是私有的。

这不常见的原因是同时拥有公共和私人成员没有意义。作为设计问题,外部代码不应访问其他类的内部。这可以通过不这样做来实现 - 无意中做到这一点并不容易。

Python 通过将所有内容都公开并允许程序员在必要时执行此操作来解决这个问题,从而创造了最大的灵活性。 Smalltalk 解决了这个问题,将所有内容都设为私有,并在需要从其他代码访问时强制程序员创建访问器。

关于实现问题,访问检查相对昂贵(因为至少对于某些属性访问,会有额外的操作,并且规则越微妙,检查就越复杂),所以 all private 和 all public模型比具有中等访问级别的任何东西都更具吸引力。

【讨论】:

  • Java 和 C# 也具有灵活性,因为在运行时不强制执行检查,如果需要访问私有,可以使用反射。
  • @Esailija 是的,当然。
【解决方案2】:

这样的事情有无数的答案,“为什么语言 X 没有特征 Y?”答案很简单,因为参与创建/发展语言的人没有把它放在那里。计算机语言就像<insert anything here that has variations across members in the set>,并非都一样。 (我们大多数人都对此表示感谢。;)

哦,移动目标问题...

我不是 Objective-C 方面的专家,但在 Google 上快速搜索“动态语言中的私有成员函数”发现了一些似乎暗示 Objective-C 确实对类有私有成员支持的命中。

【讨论】:

    【解决方案3】:

    您可以在 Objective-C 中使用类扩展来使某些东西对其他类不可见。例如。

    //at the top of MyClass.m
    @interface MyClass ()
    @property (strong, nonatomic) id myPrivateProperty;
    @end
    

    除此之外,没什么好说的,因为这个问题太宽泛了(仍然)。

    【讨论】:

      【解决方案4】:

      或者,除了@Mettable 的回答:

      @interface MyObject : NSObject {
          @private
          id _myIvar;
          id _myOtherIvar;
      }
      
      .
      .
      .
      
      @end
      

      我不了解 Python,但我认为 this SO answer 可能会有所帮助。

      【讨论】:

        猜你喜欢
        • 2017-07-31
        • 2014-06-30
        • 2010-10-22
        • 2012-08-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-23
        • 1970-01-01
        相关资源
        最近更新 更多