性状

2011-02-28 18 views
1

的无缝织造我想自动编织由延伸性状Ext引入了新的功能say的定义成抽象类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

我不完全确定你在这里做什么(或为什么) - 你能举一个你正在试图解决的问题的例子吗? – Submonoid 2011-02-28 11:28:27

回答

0

好的,正如我在评论中所说的,目前还不完全清楚你在这里要做什么,所以我不能真正尝试建议如何去做。但是,您目前使用的方法不起作用。

在这种情况下考虑类层次结构。在基地,我们有A,然后分类为B(在Base)和Ext.A。除了它们的共享超类型之外,这些不相关,所以在B的实例上您永远不会找到say方法。

通过使用单词abstract可能会引起混淆。对类(即使是内部类)的抽象修饰符并不会使其成为父类的抽象成员,但表示它本身可能具有抽象成员。可以通过类型参数或类型成员为类提供抽象类成员。不幸的是,你不能从这些AFAIK中派生出来。

+0

实际上,问题并不来自我使用'abstract'关键字。我定义了几个继承自类“A”的子类,我想避免为每个子类混合特征“Ext”: -/ – 2011-02-28 14:33:35

+0

我不认为*问题是由此产生的,只是混淆。据我所知,没有办法以这种方式做你想做的事。 – Submonoid 2011-02-28 14:45:31

2

看来你正在尝试使用虚拟类,这是Scala中没有的功能。

一旦定义了A和B,就不能重新定义它们(如方法重写)。

abstract class A 
class B extends A 

另一方面,考虑到你的例子,你的目标可以通过一个简单的mixin来实现。这里是几个重写:

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 

不知道它会真的帮助,但至少会帮助你了解发生了什么事情。

+0

实际上,正是我想通过像'特质A扩展super.A'这样的东西来避免这种情况,以便在实例化'B'时无缝地推断'with'子句:-) – 2011-03-02 11:26:30

+0

您可以使用'class BCanSay extends B在Can中有CanSay',他们做'新BCanSay'。 – pedrofurla 2011-03-02 14:51:34