以子类作为参数类型的 Scala 重写方法

wor*_*tor 5 overriding design-patterns scala

我有一个trait A方法,def fun1( b:B ):C 我想要A的子类实现 B 具有更详细的类型:

这是代码:

trait B
trait C

trait A {
  def fun1( b:B ):C
}

class B1 extends B{
}

class B2 extends B{
}


class C1 extends C{
}

class C2 extends C{
}
Run Code Online (Sandbox Code Playgroud)

我希望 的A子类可以声明如下

class X1 extends A{
    override def fun1(b:B1):C1 = ...
}


class X2 extends A{
    override def fun1(b:B2):C2 = ...
}
Run Code Online (Sandbox Code Playgroud)

然而,编译器会抱怨X1 overrides nothing. 我必须手动匹配DetailedB的类型,如下所示。

class X1 extends A{
    override def fun1(b:B):C = b match {case x:B1 => ... }
}


class X2 extends A{
    override def fun1(b:B2):C2 = b match {case x:B2 => ... }
}
Run Code Online (Sandbox Code Playgroud)

该方法无法在编译时检查类型是否正确。我怎样才能实现第一次实施?有没有什么设计模式可以解决这个问题?

类似的问题是带有子类参数的 C# Override method

puh*_*len 4

您可以使用泛型类型参数来完成此操作。

trait A[T <: B] {
   def fun1( t:T ):C
}

class X1 extends A[B1]{
    override def fun1(b:B1):C1 = ...
}
Run Code Online (Sandbox Code Playgroud)