Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 初始化特质的正确方法是什么;美国的建筑领域_Scala - Fatal编程技术网

Scala 初始化特质的正确方法是什么;美国的建筑领域

Scala 初始化特质的正确方法是什么;美国的建筑领域,scala,Scala,我对Scala比较陌生,正在尝试为一个爱好项目编写一些基本的对象关系映射。我有代表我的应用程序域对象的类,例如: class Employee(val name:String) 我希望我的ORM层记录这个employee的数据库密钥,但这不会使PublicEmployee类混乱。我想我可以用一个特质来做这件事: trait DBEntity {val id:Int} 在我的ORM层中,当查询员工时,我将返回: new Employee("Bob") with DBEntity {val i

我对Scala比较陌生,正在尝试为一个爱好项目编写一些基本的对象关系映射。我有代表我的应用程序域对象的类,例如:

class Employee(val name:String) 
我希望我的ORM层记录这个employee的数据库密钥,但这不会使PublicEmployee类混乱。我想我可以用一个特质来做这件事:

trait DBEntity {val id:Int}
在我的ORM层中,当查询员工时,我将返回:

new Employee("Bob") with DBEntity {val id=5}
这将允许我的ORM层稍后检索员工的id。我的问题是:

1) 这是混合这种特质的最佳方式吗?它可以归结为创建一个内联匿名类,我更喜欢使用DBEntity(5)的
newemployee(“Bob”)之类的东西,但是traits不能有构造函数参数,因此无法编译


2) 我正在考虑将Employee作为一个案例类来帮助以后的匹配,ORM层返回的新匿名子类是否仍然适合匹配?

这当然是有效的,但您可能会发现使用
Employee
子类
DBEntity
更干净。在这种情况下,您可能希望将trait中的
id
字段设置为
def
,并在
Employee
类中用
val
覆盖它


无论哪种方式,模式匹配都会对case类起作用。

可以匹配除
case类
es以外的其他类型的值,但要做到这一点,您必须编写自己的所谓提取器。这通常不是必需的,但知道是好的。问题是我想把DBEntity排除在公共层次结构之外-我不想让员工的客户端代码知道或关心DBEntity。我想在Java中,我会通过一个DBEntity接口来实现这一点,并且在实现DBEntity的ORM包中有一个受包保护的Employee子类。这使我能够实例化一个新员工,而无需伪造ID(例如,在添加新员工时),同时允许ORM跟踪由其实例化的员工实例。