Scala 如何谈论伴生对象与常规对象?

Scala 如何谈论伴生对象与常规对象?,scala,companion-object,Scala,Companion Object,我是第一次教Scala,我的学生发现同伴对象中故意的“双关语”非常令人困惑。考虑下面的例子: class Stack { ... methods such as push/pop } object Stack { ... factory method(s) and possibly others } 当我使用诸如“堆栈对象”或“堆栈对象”或特别是“堆栈对象”之类的动词短语时,就会产生混淆。我的学生很难理解我指的是单例对象堆栈还是堆栈类的对象 我正在寻找其他方式来表达这些东西,让初学者

我是第一次教Scala,我的学生发现同伴对象中故意的“双关语”非常令人困惑。考虑下面的例子:

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

object Stack {
  ... factory method(s) and possibly others
}
当我使用诸如“堆栈对象”或“堆栈对象”或特别是“堆栈对象”之类的动词短语时,就会产生混淆。我的学生很难理解我指的是单例对象堆栈还是堆栈类的对象

我正在寻找其他方式来表达这些东西,让初学者更容易理解。我一直考虑将Stack类的对象称为“Stack instances”或“Stack instances”,但当试图教导OO不能调用这些对象时,这似乎很疯狂。我一直试图在谈论单例对象堆栈时总是使用短语“单例对象”或“伴生对象”,但Scala的语法在这里对我不利,因为它只使用了“对象”一词

在本例中,我可以重命名singleton对象StackFactory而不是Stack,但这只是我自己的类的一个选项,而不是Scala中已经内置的一千零一个伴生对象

编辑:

对不起,我的问题不够清楚。主要的混淆不是指伴随对象。在这种情况下,正如一些人所指出的那样,很容易使用“伴生对象”这样的短语。相反,主要的混淆发生在引用普通实例时。然后,如果我说“一个堆栈对象”(意思是某个堆栈实例)或“堆栈对象”(意思是这个特定实例),一些学生会认为我指的是同伴对象——即使我没有使用companion或singleton这个词


我可以很清楚地看到混淆的来源,因为“对象”一词在程序文本中出现时只与伴随对象一起出现。

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

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

对于Scala,我建议使用以下术语:

  • 将实例化对象称为“实例”
  • 调用
    object
    s“objects”
最后,我想说,OO的概念包括对象(在模块和组合的意义上)和对象(在实例的意义上)


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

我认为你的解决方案听起来不错。“堆栈singleton”非常清楚地表示您所谈论的是一个单例对象,而不是整个对象类。至于对您不利的名称,请说明
object
声明了单个对象(singleton),而
class
是整个对象类(类实例)的模板

您可能还应该确保
对象堆栈
不是
类堆栈
的实例。如果学生不理解这一点,那么他们可能很难区分单例
堆栈
类堆栈
的实例

在本例中,我可以重命名singleton对象StackFactory 但这只是我自己的类的一个选项,而不是 Scala中已经内置了数千个伴生对象


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

如果您确实擅长保持一致性,您还可以将
类堆栈的实例称为“堆栈实例”,但这可能需要更多的习惯改变。除此之外,“堆栈伴生对象”或“对象堆栈”,决不是“堆栈对象”

我认为
堆栈单例
(如果它是独立的)或
堆栈伴侣
(如果它带有类)是命名
对象堆栈
的最佳方法。Scala语言引用将它们称为模块。但是模块现在已经与运行时实体(如OSGI)有太多的关联,所以我不太适应

  • “Stack”==类堆栈
  • “堆栈的同伴”==堆栈类的同伴对象
  • “A Stack”==类堆栈的实例

如果您希望一个单例对象成为一个类或特征的伴侣,它必须具有相同的名称(以及包和源文件)


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

也许我的建议有点幼稚,但我只想调用

  • 堆栈类:堆栈类本身(我告诉过你这很幼稚)

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

  • stack companion/stack companion object/stack singleton/stack factory(如果您使用它):stack类的companion对象

(事实上,在奥德斯基的“编程scala”中,最常用的术语是“伴生对象”,我认为这一点非常清楚……)

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

关于你的学生的困惑,我会理解,对于一个大学生来说,谨慎和一致地使用术语是多么重要,你也可以提供一些测验或e