2015-01-21 6 views
3

Я пытаюсь использовать mixins для получения типа программирования AOP/перехватчика.Композиция Mixin AOP в Scala

Вот мой код:

trait X { 
    def run 
} 

trait Y extends X { 
    abstract override def run = { 
    println("hi") 
    super.run 
    } 
} 

object Z extends X with Y { 
    def run = println("bye") 
} 

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

метод запуска `переопределение модификатор»

Что я здесь делаю неправильно ? Я пытался добавить модификатор «переопределить», но чем это дает мне:

метод запуска необходим `абстрактный ставиться модификаторы

ответ

3

Один из способов вы можете сделать это, чтобы определить базовую функциональность в класс A расширения базы X и обеспечить объект (или класс), который смешивает A и Y (и все другие черты можно определить):

trait X { 
    def run 
} 

trait Y extends X { 
    abstract override def run = { 
    println("hi") 
    super.run 
    } 
} 

class A extends X { 
    def run = println("bye") 
} 

object Z extends A with Y 

Z.run ш плохо печать

hi 
bye 
0

Вы должны создать базовый абстрактный класс:

abstract class A { 
    def run 
} 

Затем продлить его с X или Y:

trait X extends A /* OR trait Y extends A */ { 
    def run 
} 

trait Y /*extends A*/ extends X { 
    abstract override def run = { 
    println("hi") 
    super.run 
    } 
} 

Затем переместите Z.run супер класс:

class S extends A { 
    def run = println("bye") 
} 

object Z extends S with X with Y { 
    //override def run = println("bye") 
} 

Z.run 
// hi 
// bye 
+0

Я думаю, что решение Колмара получило тот же результат t с меньшими чертами/классами. Тем не менее, спасибо. :) –

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