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

我是第一次教Scala,我的学生们发现在伴侣对象中涉及的故意的“双关”非常混乱。 考虑下面的例子:

class Stack { ... methods such as push/pop } object Stack { ... factory method(s) and possibly others } 

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

我正在寻找替代方法来expression这样的东西,初学者可以更容易地理解。 我一直认为Stack类的对象是“Stack实例”或“Stack的实例”,但是当试图教OO不能调用这些东西的时候,这似乎很疯狂。 在讨论单例对象Stack时,我一直试图总是使用“singleton object”或“companion object”这个短语,但是Scala的语法在这里与我一起工作,因为它只使用单词“object”。

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

编辑:

对不起,我的问题还不够清楚。 引用伴侣对象时不会发生主要的混淆。 在这种情况下,正如几个人所指出的那样,使用诸如“同伴对象”这样的短语是很容易的。 相反,当涉及到普通情况时会出现主要的混淆。 然后,如果我说“一个堆栈对象”(意思是一些堆栈实例)或“堆栈对象”(意思是这个特定的实例),一部分学生会认为我的意思是伴侣对象 – 即使我没有使用单词伴侣或单身人士。

而且我可以很好地看到混淆来自何处,因为单词“对象”只出现伴随对象的程序文本中

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

对于斯卡拉我提出以下术语:

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

最后,我会说,面向对象的概念包括对象(在模块和组成方面)和对象(在实例的意义上)一样多。

无论你如何决定,一致性是关键,尤其是教学。

我认为Stack singleton (如果它是独立的)或Stack companion (如果它带有一个类)是命名object Stack的最佳方式。 Scala语言参考调用它们的模块。 但是,模块现在与运行时实体(如OSGI)相关联太多,无法与之相适应。

我认为使用“伴侣对象”一词应该足够清楚。

我会去的

  • “堆栈”==类堆栈
  • Stack类的“Stack's companion”==伴随对象
  • “堆栈”==类堆栈的一个实例

我想你的解决scheme听起来不错。 “ Stack单身人士”非常清楚地表明,你正在谈论的是一个单一的对象而不是整个类别的对象。 至于对你的名字工作,解释说object声明一个单一的对象(单例),而class是整个对象类(类实例)的模板。

另外一件事情,你应该确保object Stack 不是 class Stack 一个实例 。 如果学生不明白这一点,那么他们可能会更难区分单身人士Stackclass Stack实例。

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

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

如果你对于一致性很好,你也可以将class Stack的实例称为“Stack instances”,但这可能需要一些习惯。 除此之外,“堆栈伴侣对象”或“对象堆栈”,从来没有“堆栈对象”。

也许我的提议有点天真,但我只是打电话

  • 堆栈类:到堆栈类本身(我告诉你,这是天真的)

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

  • 堆栈伴侣/堆栈伴侣对象/堆栈单身/堆栈工厂(如果您使用它的话):堆栈类的伴侣对象。

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

我也会强调堆栈实例和堆栈伙伴之间的区别,这是一个常见的混淆来源。

关于你的学生的困惑,我会同情一个大学生对于使用术语是多么的重要,你还可以提供一些测验或练习来说明这些概念之间的区别。

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

如果你想要一个单例对象作为一个类或特征的伴侣,它必须具有相同的名称(以及包和源文件)。

随播广告可以访问彼此的私人成员,例如,伴侣对象中的工厂仍然可以使用私有构造函数创build(随播)类的实例。