我第一次教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中的一千个和一个伴随对象。
编辑:
抱歉,我的问题不够明确。主要的混淆不是在引用伴侣对象时发生的。在这种情况下,正如几个人所指出的那样,很容易使用诸如“伴侣对象”之类的短语。相反,在引用普通实例时会发生主要的混淆。然后,如果我说“堆栈对象”(意思是一些堆栈实例)或“堆栈对象”(意思是这个特定实例),一些学生会认为我的意思是伴侣对象 - 即使我没有使用伴侣或单身人士这个词。
我可以很清楚地看到混淆来自哪里,因为“对象”这个词在程序文本中只出现了伴随对象的。
答案 0 :(得分:19)
我认为Stack singleton
(如果它独立)或Stack companion
(如果它附带一个类)是命名object Stack
的最佳方式。 Scala语言参考将它们称为模块。但是,模块现在与运行时实体(如在OSGI中)过多关联,以便对此感到满意。
答案 1 :(得分:17)
我认为使用短语“伴侣对象”应该足够清楚。
答案 2 :(得分:8)
Scala中的这个问题当然不是没有讽刺意味,但即使在Java空间中,也可能存在关于java.lang.Object
,其实例,类和类的实例的命名问题。
对于Scala,我提出以下术语:
object
s“对象”最后,我会说OO的想法包括对象(在模块和组合的意义上)和对象(在实例意义上)。
无论你如何决定,一致性是关键,特别是对于教学。
答案 3 :(得分:7)
我会去
答案 4 :(得分:4)
我认为您的解决方案听起来不错。 “Stack
单身人士”非常清楚地表明你在谈论单身对象而不是整类对象。至于对您不利的名称,请说明object
声明单个对象(单例),而class
是整个类的模板对象(类实例)。
您应该确保的另一件事是object Stack
不是 class Stack
的实例。如果学生不理解这一点,那么他们可能会更难以区分单身Stack
和class Stack
的实例。
在这种情况下,我可以重命名单例对象StackFactory Stack,但这只是我自己的课程的一个选项,而不是 已经在Scala中构建了一千个和一个伴随对象。
请注意,如果重命名对象,则它不再是伴随对象。类及其伴随对象具有Scala编译器授予的特殊权限,以访问彼此的私有成员。如果更改单例的名称以使其与类不匹配,那么编译器不再指示它是一个伴随对象,并且它失去了伴随权限。
答案 5 :(得分:3)
如果你真的很擅长保持一致,你也可以将class Stack
的实例称为“堆栈实例”,但这可能需要一点点习惯扭曲。除此之外,“Stack伴侣对象”或“对象堆栈”,绝不是“Stack对象”。
答案 6 :(得分:1)
如果您希望单个对象成为类或特征的伴侣,则必须具有相同的名称(以及包和源文件)。
同伴可以访问彼此的私人会员,例如伴随对象中的工厂仍然可以使用私有构造函数创建(伴随)类的实例。