我读到使用Scala时,一般建议使用Traits而不是抽象类来扩展基类。
以下设计模式和布局是否合适?这是Traits旨在替换抽象类的方式吗?
- 客户端类(具有def function1)
- Trait1类(覆盖了function1)
- Trait2类(覆盖了function1)
- SpecificClient1通过trait1扩展client
- SpecificClient2通过trait2扩展client
我读到使用Scala时,一般建议使用Traits而不是抽象类来扩展基类。
以下设计模式和布局是否合适?这是Traits旨在替换抽象类的方式吗?
在我看来,最后一个原因是最重要的。至少其中一些问题可能会在未来的Scala版本中得到解决,但默认使用类将以(至少可以说)与良好设计一致的方式约束你的程序。如果你决定实际上确实需要Trait提供的能力,它们仍然会在那里,但这将是你做出的决策,而不是你悄悄地滑入其中。
因此,在没有其他信息的情况下,我建议使用一个抽象类(最好是一个密封的抽象类)和两个提供实现的具体类。
另一方面,特征允许您以细粒度的方式构建和测试复杂对象的功能,并重用核心逻辑以提供不同的风味。例如,一个域对象可能部署到数据服务器,该服务器将数据持久化到数据库中,而Web服务器可能使用相同对象的只读版本,这些版本从数据服务器更新。
没有什么适合所有情况。使用正确的结构来完成手头的任务。有时,实现的现实会揭示在设计时未知的特定用例问题。使用不同的假设和结构重新实现可能会产生出人意料的结果。
"A trait compiles directly to an interface with default methods. This improves binary compatibility and Java interoperability."
,#1-3是否仍然适用?当然,我认为#4已经足够选择abstract class
而不是trait
的理由了。@TravisBrown - Kevin Meredith