【发布时间】:2020-11-17 10:28:20
【问题描述】:
我不确定“结构联合类型”是否是正确的术语,但我试图在 Scala 中获得以下鸭子类型行为。
假设我有一些容器类Container 具有获取A 和B 类型对象的方法:
class Container {
def getA: A
def getB: B
}
A 和 B 都有一个 commontIntField 属性,但它们也有一些非共享方法:
class A {
val commonIntField: Int
def getAStringField1: String
def getAStringField2: String
}
class B {
val commonIntField: Int
def getBStringField: String
}
现在假设我要定义以下三个函数,它们看起来都非常相似:
def f1(c: Container) = {
val a = c.getA
(0 to a.commonIntField) foreach { println(a.getAStringField1) }
}
def f2(c: Container) = {
val a = c.getA
(0 to a.commonIntField) foreach { println(a.getAStringField2) }
}
def f2(c: Container) = {
val b = c.getB
(0 to b.commonIntField) foreach { println(a.getBStringField) }
}
我正在寻找某种方法来干燥它,例如像这样:
def f(getAOrB, getStringField)(c: Container) = {
val aOrB = c.getAOrB
(0 to aOrB.commonIntField) foreach { println(aOrB.getStringField) }
}
val f1 = f(_.getA, _.getAStringField1)
val f2 = f(_.getA, _.getAStringField2)
val f3 = f(_.getB, _.getBStringField)
我的问题:我可以为f 使用哪些类型参数来编译它? (这里假设我不能更改Container、A 或B 的定义,当然如果需要我可以定义辅助类型。)
【问题讨论】:
标签: scala types polymorphism duck-typing