2016-09-13 54 views
1

在我看来,我几乎可以做任何使用object,trait,abstract class和罕见场合case class。其中大部分形式为object extends trait。所以,我想知道,我应该什么时候使用普通的标准class什么时候应该在Scala中使用正规课程?

+0

Martin Odersky实际上表示Scala只需要方法,类型成员,类型投影,路径,对象和特征。其他一切基本上都只存在于平台的互操作性。但是,因为其他所有东西都是*,所以有些东西比其他东西更有意义。 IOW,即使类和特性*做了重叠,两者都有不同的用例。 –

回答

1

这是不是要问这个问题

一个正确的地方看起来,你是新Scala

Class是要建模的东西(一些实体)的规范。它包含了行为和状态

只有一个使用关键字class

两个traitabstract class宣布所谓的普通班的方式用于继承。

trait用于继承(通常在那里放置常见行为)。 trait类似于Java中的接口。多重继承可能与特性但不是abstract class

一个类可以扩展一个类或抽象类,但可以混入任意数量的特征。特质可以有行为和状态。

case class不过是一个类,但编译器为我们生成了一些样板代码,使事情变得简单和美观。

object用于声明某个类,但想在JVM中记录该类的单个实例(请记住单例模式)。

+0

为什么这不是一个正确的地方问这个问题? –

+1

@AlvaroCarrasco这个问题需要解释基本概念。答案可以尽可能长(主观),没有任何限制。 Stackoverflow更适用于您已经尝试并希望获得帮助的代码相关问题。还有其他主题概念相关问题的论坛。阅读关于stackoverflow提问规则。 – pamu

1

如果一个对象对其成员执行有状态计算,即它的成员用变量声明;或者,即使它的成员只是用vals声明,但这些vals存储了可以编辑的可变数据结构,那么它应该是一个类似于Java可变对象的普通(可变)类。

在Scala中使用Case类的惯用方式是不可变的类型,即所有的构造函数参数都是vals。我们可以使用增值税,但是我们失去了案例类的优势,例如平等比较将随着时间的推移而破裂。

Programming in Scala一些建议由Odersky的等使用特点,抽象类和具体类之间作出决定:

如果该行为将不被重用,然后使它的具体类。毕竟这不是可重用的行为。

如果它可能在多个不相关的类中重复使用,请将其作为特征。 只有特征可以混合到类层次结构的不同部分。

如果您想在Java代码中继承它,请使用抽象类。 由于具有代码的特征没有密切的Java模拟,所以它倾向于难以从Java类中的特征继承。与此同时,从一个 继承Scala类完全像继承自Java类。 作为一个例外,只有抽象成员的Scala特征将 直接转换为Java接口,因此即使您希望Java代码继承Java代码,也应该可以自由定义这种特征。有关使用Java和Scala的更多信息,请参见第29章 。

如果您计划以编译形式分发它,并且您期望外部 组编写从其继承的类,那么可以使用抽象类倾向于 。问题是,当一个成员获得或失去一个成员时,任何从它继承的类都必须重新编译,即使它们没有改变也是如此 。如果外部客户只会调用 的行为,而不是继承它,那么使用特质就没有问题。

如果效率非常重要,请倾向于使用一个类。与接口方法调用相比,大多数Java运行时对类成员的虚拟方法调用的操作速度更快,其操作速度为 。性状被编译为 接口,因此可能会支付轻微的性能开销。 但是,只有在知道特征 构成性能瓶颈并且有证据 时,才应该做出该选择,而使用类实际上可以解决问题。

如果你仍然不知道,考虑上述后,然后开始 作为一个特质。你可以随时改变它,并且通常使用特质可以打开更多的选项。

相关问题