首页 文章

如何谈论伴侣对象与常规对象?

提问于
浏览
34

我是第一次教斯卡拉,我的学生们发现故意“惩罚”涉及伴侣物体非常混乱 . 请考虑以下示例:

class Stack {
  ... methods such as push/pop
}

object Stack {
  ... factory method(s) and possibly others
}

当我使用诸如“堆栈对象”或“堆栈对象”之类的语言短语或尤其是“堆栈对象”时,会出现混淆 . 我的学生很难理解我是指单身对象Stack还是Stack类的对象 .

我正在寻找替代方法来表达这些初学者可以更容易理解的东西 . 我一直认为Stack类的对象总是称为“Stack实例”或“Stack的实例”,但是当试图教OO不能称这些东西为对象时,它似乎很疯狂 . 在谈论单例对象Stack时,我一直试图总是使用短语“singleton object”或“companion object”,但Scala的语法在那里对我不利,因为它只使用了“object”这个词 .

在这种情况下,我可以重命名单例对象StackFactory而不是Stack,但这只是我自己的类的一个选项,而不是已经内置到Scala中的一千个和一个伴随对象 .

编辑:

对不起,我的问题不够清楚 . 主要的混淆不是在引用伴侣对象时发生的 . 在这种情况下,正如几个人所指出的那样,很容易使用诸如"the companion object"之类的短语 . 相反,在引用普通实例时会发生主要的混淆 . 然后,如果我说"a stack object"(意思是一些堆栈实例)或"the stack object"(意思是这个特定实例),一些学生会认为我的意思是伴侣对象 - 即使我没有使用伴侣或单身这个词 .

而且我可以很好地看到混淆来自哪里,因为单词"object"只出现在伴随对象的情况下 in the program text .

8 回答

  • 17

    Scala中的这个问题当然不是没有讽刺意味,但即使在Java空间中,也可能存在关于 java.lang.Object ,其实例,类和类的实例的命名问题 .

    对于Scala,我提出以下术语:

    • 调用实例化对象“实例”

    • 调用 object s“对象”

    最后,我会说OO的概念包括对象(在模块和组合的意义上)和对象(在实例意义上) .

    无论你如何决定,一致性是关键,特别是对于教学 .

  • 4

    我认为 Stack singleton (如果它独立)或 Stack companion (如果它附带一个类)是命名 object Stack 的最佳方式 . Scala语言参考将它们称为模块 . 但是,模块现在已经与运行时实体(如在OSGI中)过多关联,以便对此感到满意 .

  • 19

    我认为使用短语“伴侣对象”应该足够清楚 .

  • 7

    我会去的

    • "Stack" == class 堆栈

    • "Stack's companion" == Stack类的伴随对象

    • "A Stack" == Stack类的一个实例

  • 1

    我认为你的解决方案听起来不错“ Stack 单身人士”非常清楚地表明你在谈论单身对象而不是整类对象 . 至于对你不利的名字,请说明 object 声明一个对象(单例),而 class 是整个对象类(类实例)的模板 .

    您应该确定的另一件事是 object Stack 不是 class Stack 的实例 . 如果学生们可能难以区分单身 Stackclass Stack 的实例 .

    在这种情况下,我可以重命名单个对象StackFactory而不是Stack,但这只是我自己的类的一个选项,而不是已经内置到Scala中的一千个和一个伴随对象 .

    请注意,如果重命名对象,则它不再是伴随对象 . 类及其伴随对象具有Scala编译器授予的特殊权限,以访问彼此的私有成员 . 如果更改单例的名称以使其与类不匹配,则编译器不再指示它是伴随对象并且它失去了伴随特权 .

  • 8

    如果你真的很善于保持一致,你也可以将 class Stack 的实例称为"Stack instances",但这可能需要一点点习惯扭曲 . 除此之外,"the Stack companion object"或"object Stack",永远"the Stack object" .

  • 3

    也许我的建议有点天真,但我会打电话

    • 堆栈类:到堆栈类本身(我告诉你它天真)

    • 堆栈/堆栈实例/堆栈对象:堆栈类的实例

    • stack companion / stack companion object / stack singleton / stack factory(如果你为此目的使用它):stack类的伴随对象 .

    (事实上,在Odersky的“编程scala”中,最常用的术语是“伴侣对象”,我认为这很清楚......)

    我还要强调堆栈实例和堆栈伙伴之间的区别,这是混淆的常见原因 .

    关于你学生的困惑,我会同情大学生要小心并且与术语的使用一致的重要性,你也可以提供一些测验或练习来区分这些概念 .

    有时,使用它可以更好地学习术语 .

  • 2

    如果您希望单个对象成为类或特征的伴随对象,则 must 具有相同的名称(以及包和源文件) .

    同伴可以访问彼此的私人成员,例如伴随对象中的工厂仍然可以使用私有构造函数创建(伴随)类的实例 .

相关问题