无缝编织的特质

时间:2011-02-28 11:14:15

标签: scala

我想自动将扩展特征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

任何方式吗?

2 个答案:

答案 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,然后使用BBase)和Ext.A进行子类化。这些与其共享超类型无关,因此您永远不会在say的实例上找到B方法。

通过使用abstract这个词可能会产生混淆。类(甚至是内部类)上的抽象修饰符不会使它成为父类的抽象成员,而是表示它本身可能具有抽象成员。有一种方法可以为类提供一个抽象类成员 - 通过类型参数或类型成员。不幸的是,你无法从这些AFAIK中获得。