有没有办法将特征混合到 Dotty 或 Scala 中的现有对象中?
class SomeClass
trait SomeTrait
// This works, but it's not what I'm looking for:
new SomeClass with SomeTrait
// This is what I'm looking for, but it breaks:
val someClass = new SomeClass
someClass with SomeTrait
This https://stackoverflow.com/questions/10373318/mixing-in-a-trait-dynamically答案提供了一个宏观解决方案,但它已经有 7 年历史了,我希望(祈祷!)有更简单的东西。
那么使用类型类呢?
从您在评论中提供的示例来看您的问题:
trait Organism
trait Winged[O <: Organism]
trait Legged[O <: Organism]
class Dog extends Organism
object Dog {
implicit val legged: Legged[Dog] = new Legged[Dog] { ... }
}
class Fly extends Organism
object Fly {
implicit val winged: Winged[Fly] = new Winged[Fly] { ... }
implicit val legged: Legged[Fly] = new Legged[Fly] { ... }
}
这是一种非常灵活的方法,允许您定义Legged
and Winged
设计特定有机体时的属性,或稍后通过相应伴生对象外部的隐式添加它们。您可以通过提供伴生对象中的隐含内容来强制有机体始终拥有腿/翅膀,或者将其留给代码的用户。
然后您可以定义
// Only Winged organisms (ie. `O` for which `Winged[O]` is available implicitly
def makeItFly[O <: Organism : Winged](o: O)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)