2017-03-06 95 views
0

我可以创建一个案例类有用只为一个Collecetion(读HashSet)和一个类扩展这个案例类存储有用的信息?类扩展案例类的集合

我的意思是这样的:

case class User(id: String) 

class UserInfo(id: String) extends User(id) { 

    var time = 0 
    var sum = 0 

} 

我只想用的UserInfo,以存储的HashSet内的用户信息,但使用所有有用的方法的情况下类实现已收集实施(又名equalshashCode

继尤瓦Itzchakov评论:

abstract class User(val id: String) { 

    private var time = 0L 
    private var sum = 0L 

    def addTime(_time: Long) = time += _time 
    def addSum(_sum : Long) = sum += _sum 

    def getTime() = time 
    def getSum() = sum 

} 

case class UserInfo(override val id : String) extends User(id) 

private vars,因为我想保证我只能添加信息(对于获取者来说是一样的)

+0

如何使'用户'抽象类和'UserInfo'案例类? –

+0

然后我可以在抽象类中添加所有有用的方法,对吗? –

+0

是的,你可以。 –

回答

2

可变性是一个坏主意,应该几乎总是避免它。在保留不变性的同时,你需要的一种方法是伴随对象:

case class User(id: String, time: Long) 

object User { 
    def addTime(user: User, time: Long): User = user.copy(time = user.time + time) 
} 

val users = Set(User("John", 5), User("Mary", 10)) 
val sumTime = users.foldLeft(0L)((sum, user) => sum + user.time) 
val usersWithTimeAdded = users.map(User.addTime(_, 2)) 
+0

我可以问你一件事吗? 如果我有一个用户“约翰”,该怎么办? 现在,如果我添加到一个'集合(用户(“约翰”,2),用户(“约翰”,4))'我的集合将有2约翰用户,对吧?我不想要这个。我需要一个用户约翰,每当我找到关于它的新信息时,我需要添加到约翰实例 –

+0

许多方式来处理。一个是使用'Map [String,User]'。获取“John”的'User'值;给它增加时间;并用'map +(“John” - > newTime)''产生一个新的地图副本,其中更新后的值将被更新。或者,如果你想变得有趣,你可以为此目的创建一个特殊的函数 - 甚至可以通过一个隐式类来赋予该函数'Map',如[这里]所述(http://stackoverflow.com/a/) 1347281分之9004242)。 – Vidya

+0

是的,但我想过,但我问一个集(我的意思是,我想避免一个地图,因为用户对象已经自己处理信息) –