Self-Types

Sakaze
Neuling
Neuling
Beiträge: 9
Registriert: 26. Apr 2011 13:02

Self-Types

Beitrag von Sakaze » 10. Jul 2017 14:38

Hi,
ich habe eine Frage zu Vorlesung 5.2 Folie 20.

Da wird Self-Type verwendet und gesagt, dass der direkte Aufruf der Interfacemethode nicht klappt, weil's an der Kompilierung scheitert.
Ich habe das mal getestet und habe ein anderes Ergebnis erwartet. Zunächst der Code, dann der Output.

Code: Alles auswählen

object Test  extends App{

  println("Hello")
  val someCalculation = new SomeCalculation() with Add
  println(someCalculation.calc(10,15))

  val adder: Add = someCalculation.asInstanceOf[Add]
  println(adder.calc(10, 15))

  println("instance of Add: "+someCalculation.isInstanceOf[Add])
  println("instance of Mul: "+someCalculation.isInstanceOf[Mul])
  println("instance of Calc: "+someCalculation.isInstanceOf[Calc])
}

trait Calc {
  def calc(x:Int, y:Int): Int
}

trait Add extends Calc{
  override def calc(x: Int, y: Int): Int = x+y
}
trait Mul extends Calc{
  override def calc(x: Int, y: Int): Int = x*y
}

class SomeCalculation{
  this: Calc =>
  def doCalculation(x:Int,y:Int):Int = calc(x,y)
}
Output:
Hello
25
25
instance of Add: true
instance of Mul: false
instance of Calc: true
Nun meine Frage: Habe warum kompiliert mein Code, obwohl es auf der Folie anders vorhergesagt wird? Oder habe ich da was falsch verstanden?
Ich bitte um Aufklärung :?
Viele Grüße

eichberg
Dozentin/Dozent
Beiträge: 448
Registriert: 25. Sep 2007 12:12
Kontaktdaten:

Re: Self-Types

Beitrag von eichberg » 10. Jul 2017 14:46

Sie können auf der "container" nicht Layout aufrufen, da Container "LayoutEngine" nicht implementiert.... In Ihrem Beispiel haben Sie jedoch bereits "Add" eingemixt - auf der resultierenden Klasse "SomeCalculation with Add" können Sie natürlich alle Methoden aufrufen. Am Einfachsten ist es zu sehen, wenn Sie den Type von "someCalculation" explizit angeben: "val someCalculation : (SomeCalculation with Add) = ..."

Hope this helps.

Sakaze
Neuling
Neuling
Beiträge: 9
Registriert: 26. Apr 2011 13:02

Re: Self-Types

Beitrag von Sakaze » 10. Jul 2017 16:16

Ok, danke für die schnelle Antwort. Ich habe gerade den entscheidenden Punkt gefunden.

Code: Alles auswählen

val someCalculation = new SomeCalculation() with Add
ist äquivalent zu

Code: Alles auswählen

val someCalculation  : (SomeCalculation with Add) = new SomeCalculation() with Add
und nicht gleich

Code: Alles auswählen

val someCalculation : SomeCalculation = new SomeCalculation() with Add

Antworten

Zurück zu „Archiv“