当我浏览Paul Phillips GitHub存储库时,我注意到他经常使用某种结构:
trait A {
// ...
}
object A extends A
Run Code Online (Sandbox Code Playgroud)
例如这里:scala-
improvement ,strings首先,来自Java,我不知道在同一范围内具有相同的特征和特征的对象.
现在我问它有什么好处?与所有特征成员直接定义对象有什么好处?好吧,我知道这个特性可以混入,但我假设在实践中只使用了这个对象.
Jea*_*let 11
至少有一种情况是这种模式派上用场的是当你构建一个函数库时.您可以重组功能(实际上的方法,但让我们称他们在这方面的功能)到几个特点(然后可以被视为模块),也就是说,MyLibA
,MyLibB
,MyLibC
,等.然后,如果他们每个人,你定义一个对象实现它,你的lib的用户可以通过写,例如,这样轻松地使用它:
import mypackage.MyLibA._
Run Code Online (Sandbox Code Playgroud)
(假设mypackage
是包含的包).此外,您可以通过提供如下对象轻松提供导入lib的所有功能的方法MyLib
:
object MyLib extends MyLibA with MyLibB with MyLibC
Run Code Online (Sandbox Code Playgroud)
然后用户可以简单地导入mypackage.MyLib._
而不是分别为每个模块编写导入.更好的是,您可以定义一个package object mypackage extends MyLibA with MyLibB with MyLibC
,然后用户只需编写import mypackage._
.而且,奖金是想谁挑剔的用户只进口MyLibA
和MyLibB
在同一行也可以自由定义自己的"导入对象",甚至可能用自己的效用函数完成它,或者重写你自己:
object UserLibImport extends MyLibA with MyLibB {
def userAdditionalFunction = /* ... */
override def someRedefinedLibAFunction = /* ... */
}
Run Code Online (Sandbox Code Playgroud)
...然后导入所有内容 import UserLibImport._
所以,我想说,在这种情况下,它不仅是好的风格,强烈建议以这种方式提供你的功能,因为它允许最大的灵活性.
归档时间: |
|
查看次数: |
1823 次 |
最近记录: |