Давайте посмотрим на следующий очень простой пример торта:
trait PrintSomething{
def printSomeThing(s:String):Unit
}
trait PrintSomethingToConsole extends PrintSomething{
override def printSomeThing(s: String): Unit = println("Print To Console!!!")
}
trait PrintSomethingToLog extends PrintSomething{
override def printSomeThing(s: String): Unit = println("Print To Log!!!")
}
class MyAction{
self:PrintSomething =>
printSomeThing("This is it")
}
new MyAction with PrintSomethingToConsole
new MyAction with PrintSomethingToLog
В некоторых блогах я вижу, что плохая сторона этого паттерна ломается
Open-Close Principle
и Interface Segregation Principle
.
Насколько я понимаю, в MyAction есть возможность переопределить метод printSomething
и изменять функциональность независимо от того, какая черта PrintSomething
была введена:
class MyAction{
self:PrintSomething =>
override def printSomeThing(s: String): Unit = println("I just Broke Open-Close Principle!!!!! ")
}
Я прав?
Однако я не понимаю, как я могу нарушить Interface Segregation Principle
здесь. Кто-нибудь может уточнить?