让我们看看下面这个非常简单的蛋糕图案示例:
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
。有人可以详细说明吗?
我认为与开闭原则没有任何冲突。您的所有类和特征都可以扩展,也可以关闭以进行修改。而且由于它们只有一种方法,因此接口隔离原则并不真正适用!
即使您在MyAction
类中覆盖printSomeThing
,您仍然没有违反任何一项原则。所有对象都保持打开状态以进行扩展(您可以扩展它们)并关闭以进行修改(您无法更改它们的行为)。PrintSomethingToLog
的实例将始终打印到日志中;您无法修改它以打印到控制台。
PrintSomething
的实例可能有不同的printSomeThing
实现,但这只是通过继承的多态性;这并不意味着PrintSomething
可以修改,因为PrintSomething
是一个接口,而不是一个具体的类,你不能改变接口。