gpt4 book ai didi

scala - 如何在Scala中多次继承通用特征?

转载 作者:行者123 更新时间:2023-12-03 21:07:11 26 4
gpt4 key购买 nike

我有一个看起来像这样的特征:

trait Ingredient[T] {
def foo(t: T): Unit = {
// Some complex logic
}
}
以及我想要方法的类型:
class Cheese
class Pepperoni
class Oregano
如何制作另一个具有方法的特征:
def foo(t: Cheese)
def foo(t: Pepperoni)
def foo(t: Oregano)
不复制代码?以下将不起作用,因为它多次从同一特征非法继承:
trait Pizza extends Ingredient[Cheese] with Ingredient[Pepperoni] with Ingredient[Oregano] {}

最佳答案

我将提供 2 个解决方案:

  • 如果您可以定义 Cheese , Pepperoni , 和 Oregano作为特征,您可以执行以下操作:
    trait Ingredient {
    def foo[T <: Ingredient](t: T): Unit = {
    println(t)
    }
    }
    然后扩展它:
    trait Cheese extends Ingredient {
    override def toString: String = "Cheese"
    }
    trait Pepperoni extends Ingredient {
    override def toString: String = "Pepperoni"
    }
    trait Oregano extends Ingredient {
    override def toString: String = "Oregano"
    }
    用法是:
    trait Pizza extends Ingredient

    val pizza = new Pizza { }

    pizza.foo(new Cheese { })
    pizza.foo(new Pepperoni { })
    pizza.foo(new Oregano { })
    代码运行于 Scastie .
  • 使用密封特征。这种方法将成分与问题中绑定(bind)的最终产品分开:
    sealed trait Ingredient
    sealed trait PizzaIngredient extends Ingredient
    case object Cheese extends PizzaIngredient
    case object Pepperoni extends PizzaIngredient
    case object Oregano extends PizzaIngredient
    case object Cucumber extends Ingredient
    然后定义 Pizza特征:
    trait Pizza {
    def foo[T <: PizzaIngredient](t: T): Unit = {
    println(t)
    }
    }
    用法是:
    val pizza = new Pizza { }
    pizza.foo(Cheese)
    pizza.foo(Pepperoni)
    pizza.foo(Oregano)
    代码运行于 Scastie
  • 关于scala - 如何在Scala中多次继承通用特征?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65759307/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com