2013-12-21 2 views
2

Мой вопрос ниже - это, безусловно, глупость, но ответ на него поможет мне в еще одной проблеме. Как заставить символ перемещаться только определенным классом (или его подклассом). Я думал об использовании требуют() внутри него:Рассмотрите признак как подкласс другого класса

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 
} 

Тогда, я не знаю, как considere Trait1 как Aclass (для того, чтобы избежать asInstanceOf где каждый). Я знаю, что функция f должна быть в Aclass, но, как я уже сказал, мне хотелось бы знать, как правильно заставить признак быть смешанным с определенным классом и как получать сообщения этого класса в признаке.

Интересно, это потому, что мне нужен черта перемешиваются определенным классом с шаблоном:

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

Спасибо.

ответ

4

Само типирование:

class MyClass1 
class MyClass2 

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

scala> new MyClass1 with MyTrait 
res0: MyClass1 with MyTrait = [email protected] 

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.

+0

избил меня :) – Thayne

Смежные вопросы