在我看来,我几乎可以做任何使用object
,trait
,abstract class
和罕见场合case class
。其中大部分形式为object extends trait
。所以,我想知道,我应该什么时候使用普通的标准class
?什么时候应该在Scala中使用正规课程?
回答
这是不是要问这个问题
一个正确的地方看起来,你是新Scala
Class
是要建模的东西(一些实体)的规范。它包含了行为和状态
只有一个使用关键字class
两个trait
和abstract class
宣布所谓的普通班的方式用于继承。
trait
用于继承(通常在那里放置常见行为)。 trait
类似于Java中的接口。多重继承可能与特性但不是abstract class
。
一个类可以扩展一个类或抽象类,但可以混入任意数量的特征。特质可以有行为和状态。
case class
不过是一个类,但编译器为我们生成了一些样板代码,使事情变得简单和美观。
object
用于声明某个类,但想在JVM中记录该类的单个实例(请记住单例模式)。
为什么这不是一个正确的地方问这个问题? –
@AlvaroCarrasco这个问题需要解释基本概念。答案可以尽可能长(主观),没有任何限制。 Stackoverflow更适用于您已经尝试并希望获得帮助的代码相关问题。还有其他主题概念相关问题的论坛。阅读关于stackoverflow提问规则。 – pamu
如果一个对象对其成员执行有状态计算,即它的成员用变量声明;或者,即使它的成员只是用vals声明,但这些vals存储了可以编辑的可变数据结构,那么它应该是一个类似于Java可变对象的普通(可变)类。
在Scala中使用Case类的惯用方式是不可变的类型,即所有的构造函数参数都是vals。我们可以使用增值税,但是我们失去了案例类的优势,例如平等比较将随着时间的推移而破裂。
从Programming in Scala一些建议由Odersky的等使用特点,抽象类和具体类之间作出决定:
如果该行为将不被重用,然后使它的具体类。毕竟这不是可重用的行为。
如果它可能在多个不相关的类中重复使用,请将其作为特征。 只有特征可以混合到类层次结构的不同部分。
如果您想在Java代码中继承它,请使用抽象类。 由于具有代码的特征没有密切的Java模拟,所以它倾向于难以从Java类中的特征继承。与此同时,从一个 继承Scala类完全像继承自Java类。 作为一个例外,只有抽象成员的Scala特征将 直接转换为Java接口,因此即使您希望Java代码继承Java代码,也应该可以自由定义这种特征。有关使用Java和Scala的更多信息,请参见第29章 。
如果您计划以编译形式分发它,并且您期望外部 组编写从其继承的类,那么可以使用抽象类倾向于 。问题是,当一个成员获得或失去一个成员时,任何从它继承的类都必须重新编译,即使它们没有改变也是如此 。如果外部客户只会调用 的行为,而不是继承它,那么使用特质就没有问题。
如果效率非常重要,请倾向于使用一个类。与接口方法调用相比,大多数Java运行时对类成员的虚拟方法调用的操作速度更快,其操作速度为 。性状被编译为 接口,因此可能会支付轻微的性能开销。 但是,只有在知道特征 构成性能瓶颈并且有证据 时,才应该做出该选择,而使用类实际上可以解决问题。
如果你仍然不知道,考虑上述后,然后开始 作为一个特质。你可以随时改变它,并且通常使用特质可以打开更多的选项。
- 1. 我们什么时候应该上课,什么时候不应该上课
- 2. 什么时候应该使用AWS,什么时候不使用
- 3. 什么时候应该使用Import-Package,什么时候应该使用Require-Bundle?
- 4. 什么时候应该在WPF应用程序中使用PixelFormats.Pbgra32?
- 5. 什么时候应该使用PostgreSQL中
- 6. 什么时候应该在正则表达式中使用\ A?
- 7. 什么时候应该使用UdpClient.BeginReceive?什么时候应该在后台线程上使用UdpClient.Receive?
- 8. 什么时候应该使用datagrid,何时应该使用datagridview?
- 9. 什么时候应该使用$(object),何时应该使用$ object?
- 10. 什么时候应该在IOS编程中使用UIViewController?
- 11. 在C#中,什么时候应该使用一个结构,什么时候应该使用一个类?
- 12. 什么时候应该在scala中使用泛型类中的类型绑定?
- 13. 什么时候应该使用getElementById?
- 14. 什么时候应该使用_aligned_malloc()?
- 15. 什么时候应该使用GC.SuppressFinalize()?
- 16. 什么时候应该使用`use`?
- 17. 什么时候应该使用didFinishLaunchingWithOptions?
- 18. 什么时候应该使用模板
- 19. 什么时候应该使用可可?
- 20. 什么时候应该使用RESTful?
- 21. 什么时候应该使用const?
- 22. 什么时候应该使用git add?
- 23. 什么时候应该使用html5 sessionStorage?
- 24. 我什么时候应该使用javax.swing.SwingUtilities.invokeLater()?
- 25. 什么时候应该使用Solandra
- 26. 什么时候应该使用*,&,。 , - >?
- 27. 什么时候应该使用$(document).ready?
- 28. 什么时候应该使用scala.util.DynamicVariable?
- 29. 什么时候应该使用流?
- 30. 我什么时候应该使用UITableViewCellSeparatorStyleSingleLineEtched?
Martin Odersky实际上表示Scala只需要方法,类型成员,类型投影,路径,对象和特征。其他一切基本上都只存在于平台的互操作性。但是,因为其他所有东西都是*,所以有些东西比其他东西更有意义。 IOW,即使类和特性*做了重叠,两者都有不同的用例。 –