在运行时获得最精确的隐含

时间:2017-02-01 15:58:08

标签: scala design-patterns implicit

抱歉标题不好。
我使用的是具有基本特征和该特征的多个实现的库。但是,代替传统的方法重写,方法专门化是由采用隐式参数的方法提供的。一般模式如下

class Cont[TT](val n : Int)

trait I[ +Self ] {
  final def foo[TT >: Self](implicit num : Cont[TT]) = num.n
}

trait B extends I[B] 

object B {
  implicit def Mint : Cont[B] = new Cont[B](53)
}

class S extends B with I[S]

object S{
  implicit def HMint : Cont[S] = new Cont[S](54)
}

B是"基类型"其中你将有几个子类(其中S是一个例子)。这个子类中的每一个都会提供一些含义(就像我们在示例中对Cont所做的那样),每个子类对于它想要专门化的每个方法都有一个含义。如果未定义某个隐式,则使用B中的一个隐式(未在上面的代码中显示)。实际上要在B及其子类上调用的方法在特征I中定义,每种方法都有一种类型 我的问题是我想编写泛型函数,将B或其子类的集合作为参数,并调用它们的方法,但我希望调用最具体的含义。 问题是与方法覆盖不同,编译时间" type定义要调用的方法。例如:

val s = new S
val b : B = s
(b.foo,s.foo)
res50: (Int, Int) = (53,54)

我是否可以通过调用最具体的方法来编写通用函数?如果没有,那么库中会有一些轻微的变化吗?最后,这个库使用的模式是否有名称?很难找到一个名字并不知道的模式的信息。

1 个答案:

答案 0 :(得分:1)

您可以编写将基类型作为传递参数的泛型函数,但是如果您需要该类型的成员方法,则必须确定派生类型。

def f(b:B) = b match {
  case s:S => s.foo
  case _ => b.foo
}
f(new S)  // res0: Int = 54

P.S。唉,我不知道那个模式是否有名字。