在 Scala 中覆盖不同类型的特征函数
Overriding trait functions with different types in Scala
我有以下内容:
类 "Hashtag" 和 "Keyword" 每个扩展特征 "Data"
类 "HashtagManager" 和 "KeywordManager" 每个扩展特征 "DataManager"
它们具有相同的功能,只是它们管理的类型 (hashtags/keywords) 不同。
HashtagManager 有一个 List[Hashtag],KeywordManager 有一个 List[Keyword]
我希望 DataManager 实现函数 findInList(X),其中 X 是标签或关键字。
如何在 DataManager 中以通用方式编写 整个 函数实现,同时在 HashtagManager/KeywordManager 中覆盖 X 的 TYPE 使其可变?
此外,DataManager 怎么会有一个 List[X] 的通用 var,在每个子类管理器中覆盖这个 var 时,它分别变成 List[Hashtag]、List[Keyword]?
我觉得你的情况是这样的
trait Data
class Hashtag extends Data
class Keyword extends Data
trait DataManager {
// need a List[Data]
// need a findInList(x: Data)
}
class HashtagManager extends DataManager
class KeywordManager extends DataManager
如果您希望列表开始时为空,您可以...
trait DataManager[T <: Data] {
var l: List[T] = List.empty[T]
def findInList(x: T) = ??? // not sure what you want to find
}
class HashtagManager extends DataManager[Hashtag]
class KeywordManager extends DataManager[Keyword]
如果您想在 class 实例化时初始化您的列表 l,您可以 ...
trait DataManager[T <: Data] {
var l: List[T]
def findInList(x: T) = ??? // not sure what you want to find
}
class HashtagManager(var l: List[Hashtag]) extends DataManager[Hashtag]
class KeywordManager(var l: List[Keyword]) extends DataManager[Keyword]
关键部分是 [T <: Data]
,它允许您使用类型 T
(继承自 Data
)
来定义 methods/vars/vals
我有以下内容:
类 "Hashtag" 和 "Keyword" 每个扩展特征 "Data"
类 "HashtagManager" 和 "KeywordManager" 每个扩展特征 "DataManager"
它们具有相同的功能,只是它们管理的类型 (hashtags/keywords) 不同。
HashtagManager 有一个 List[Hashtag],KeywordManager 有一个 List[Keyword]
我希望 DataManager 实现函数 findInList(X),其中 X 是标签或关键字。
如何在 DataManager 中以通用方式编写 整个 函数实现,同时在 HashtagManager/KeywordManager 中覆盖 X 的 TYPE 使其可变?
此外,DataManager 怎么会有一个 List[X] 的通用 var,在每个子类管理器中覆盖这个 var 时,它分别变成 List[Hashtag]、List[Keyword]?
我觉得你的情况是这样的
trait Data
class Hashtag extends Data
class Keyword extends Data
trait DataManager {
// need a List[Data]
// need a findInList(x: Data)
}
class HashtagManager extends DataManager
class KeywordManager extends DataManager
如果您希望列表开始时为空,您可以...
trait DataManager[T <: Data] {
var l: List[T] = List.empty[T]
def findInList(x: T) = ??? // not sure what you want to find
}
class HashtagManager extends DataManager[Hashtag]
class KeywordManager extends DataManager[Keyword]
如果您想在 class 实例化时初始化您的列表 l,您可以 ...
trait DataManager[T <: Data] {
var l: List[T]
def findInList(x: T) = ??? // not sure what you want to find
}
class HashtagManager(var l: List[Hashtag]) extends DataManager[Hashtag]
class KeywordManager(var l: List[Keyword]) extends DataManager[Keyword]
关键部分是 [T <: Data]
,它允许您使用类型 T
(继承自 Data
)