让我们看下面的非常简单的蛋糕图案示例:
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
。
据我了解,无论注入了哪种printSomething
特性,都可以重写MyAction中的PrintSomething
方法并修改功能:
class MyAction{
self:PrintSomething =>
override def printSomeThing(s: String): Unit = println("I just Broke Open-Close Principle!!!!! ")
}
我对吗?
但是我不明白如何违反这里的Interface Segregation Principle
。有人可以详细说明吗?
答案 0 :(得分:1)
我认为与开放-封闭原则没有任何冲突。您所有的类和特征都可以进行扩展,而封闭则可以进行修改。而且,由于它们只有一个方法,所以接口隔离原理实际上并不适用!
即使您在printSomeThing
类中重写MyAction
,您仍然没有违反任何一个原则。所有对象保持打开状态以进行扩展(可以扩展它们),并关闭状态以进行修改(不能更改其行为)。 PrintSomethingToLog
的实例将始终打印到日志;您不能修改它以打印到控制台。
PrintSomething
的实例可能具有printSomeThing
的不同实现,但这仅仅是通过继承实现的多态性。这并不意味着PrintSomething
是开放的,因为PrintSomething
是一个接口,而不是一个具体的类,并且您不能更改该接口。