Прежде всего, я хотел бы отметить, что метод combine
вообще не использует параметр other
, вы также можете написать:
def combine(key : TKey) : Node = set(key, aval)
.. но я думаю,это просто принцип, которого мы придерживаемся здесь.
Если у вас очень маленький набор допустимых комбинаций TKey и TValue (скажем, 2), вы можете использовать тактику абстрактного типа и вырезать из кода все параметризованные типывместе:
trait INode
{
type TKey
type TValue
def get(key : TKey) : TValue
def set(key : TKey, v : TValue) : INode
def combine(other : INode, key : TKey): INode
}
case class StringNode(
val m_key : String,
val m_val : String
) extends INode
{
type TKey = String
type TValue = String
override def get(key : TKey) : TValue = { m_val }
override def set(key : TKey, v : TValue) : INode = new StringNode(key,v)
override def combine(other : INode, key :TValue): INode = {
other match {
case node: StringNode => node.set(key, m_val)
case _ => throw new IllegalArgumentException("Not OK bla bla")
}
}
}
В моем примере вы получите некоторое дублирование кода в методах StringNode
и, скажем, IntNode
, но по крайней мере проиллюстрирован принцип абстрактных типов.