我想自动将扩展特征say
引入的新函数Ext
的定义编织到抽象类A
中:
class Base {
abstract class A
class B extends A
case class C extends A
}
trait Ext extends Base {
trait A extends super.A {
def say = "hello"
}
}
object Test extends Base with Ext {
val b = new B
b.say
}
但是,我收到以下错误:
<console>:12: error: value say is not a member of Test.B
b.say
任何方式吗?
答案 0 :(得分:2)
您似乎正在尝试使用虚拟类,这是Scala中没有的功能。
一旦定义了A和B,就无法重新定义(如方法覆盖)。
abstract class A
class B extends A
另一方面,举个例子,你的目标可以通过一个简单的混合来实现。这里只有很少的重写:
class Base {
abstract class A
class B extends A
case class C extends A
}
trait Ext extends Base {
trait CanSay extends A {
def say = "hello"
}
}
object Test extends Base with Ext {
val b = new B with CanSay
def apply = b.say
}
Test.apply
不确定这会有什么帮助,但至少会帮助您了解正在发生的事情。
答案 1 :(得分:0)
好吧,正如我在评论中所说的那样,你在这里尝试做什么并不完全清楚,所以我无法真正尝试建议如何做到这一点。但是,您目前使用的方法将无效。
在这种情况下考虑类Hierarchy。在底部,我们有A
,然后使用B
(Base
)和Ext.A
进行子类化。这些与其共享超类型无关,因此您永远不会在say
的实例上找到B
方法。
通过使用abstract
这个词可能会产生混淆。类(甚至是内部类)上的抽象修饰符不会使它成为父类的抽象成员,而是表示它本身可能具有抽象成员。有一种方法可以为类提供一个抽象类成员 - 通过类型参数或类型成员。不幸的是,你无法从这些AFAIK中获得。