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

时间:2012-09-19 14:30:13

标签: scala companion-object

我第一次教Scala,我的学生们发现伴随物体的故意“惩罚”非常令人困惑。请考虑以下示例:

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中的一千个和一个伴随对象。

编辑:

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

我可以很清楚地看到混淆来自哪里,因为“对象”这个词在程序文本中只出现了伴随对象的

7 个答案:

答案 0 :(得分:19)

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

答案 1 :(得分:17)

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

答案 2 :(得分:8)

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

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

  • 调用实例化对象“instances”
  • 致电object s“对象”

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

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

答案 3 :(得分:7)

我会去

  • “Stack”==类Stack
  • “Stack的伴侣”== Stack类的伴随对象
  • “Stack”== Stack类的实例

答案 4 :(得分:4)

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

您应该确保的另一件事是object Stack 不是 class Stack的实例。如果学生不理解这一点,那么他们可能会更难以区分单身Stackclass Stack的实例。

  

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

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

答案 5 :(得分:3)

如果你真的很擅长保持一致,你也可以将class Stack的实例称为“堆栈实例”,但这可能需要一点点习惯扭曲。除此之外,“Stack伴侣对象”或“对象堆栈”,绝不是“Stack对象”。

答案 6 :(得分:1)

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

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