将特征视为另一个类的子类

时间:2013-12-21 19:06:26

标签: scala instance require traits

下面我的问题绝对是胡说八道,但回答它会帮助我解决另一个问题。 如何强制特征仅由特定类(或其子类)混合。我想过在里面使用require():

abstract class Aclass(c_attribut1 : Int){
  var attribut1 : Int = c_attribut1

  def getAttribut1() : Int = this.attribut1 
}

class Bclass extends Aclass(1) with Trait1{

}

class Cclass extends Aclass(2) with Trait1{

}


trait Trait1{
  require(this.isInstanceOf[Aclass]);

  def f() : Int = this.getAttribut1() * 2 // it obviously does not work
}

然后,我不知道如何将Trait1视为一个Aclass(为了避免asInstanceOf每个地方)。我知道函数f应该在Aclass中,但正如我所说,我想知道如何正确强制特定类混合特征以及如何在特征中获取此类消息。

我想知道这是因为我需要一个特定类与模板混合的特征:

trait TraitBuiltHost extends Observable{
  require(this.isInstanceOf[BuiltInfrastructure[_ <: TraitHostDefinition]]);
  .
  .
  .
}

谢谢。

1 个答案:

答案 0 :(得分:4)

自我输入:

class MyClass1
class MyClass2

trait MyTrait {
  self: MyClass1 =>
  val i = 1
}

scala> new MyClass1 with MyTrait
res0: MyClass1 with MyTrait = $anon$1@3f0762f6

scala> new MyClass2 with MyTrait
<console>:1: error: illegal inheritance;
 self-type MyClass2 with MyTrait does not conform to MyTrait's selftype MyTrait with MyClass1
              new MyClass2 with MyTrait
                                ^

另请参阅scala tag wiki自我引用部分。