我听说Liskov替换原则(LSP)是面向对象设计的基本原则.它是什么以及它的使用例子是什么?
oop liskov-substitution-principle definition design-principles solid-principles
我可以在Predef的API文档中看到它们是泛型函数类型(From)=> To的子类,但就是这样.嗯什么?也许某处有文档,但搜索引擎不能很好地处理"<:<"之类的"名称",所以我无法找到它.
后续问题:我什么时候应该使用这些时髦的符号/类,为什么?
已经一个方法被提出来处理的重载方法双定义是,以取代与模式匹配超载:
object Bar {
def foo(xs: Any*) = xs foreach {
case _:String => println("str")
case _:Int => println("int")
case _ => throw new UglyRuntimeException()
}
}
Run Code Online (Sandbox Code Playgroud)
这种方法要求我们放弃对参数的静态类型检查foo.能够写作会好得多
object Bar {
def foo(xs: (String or Int)*) = xs foreach {
case _: String => println("str")
case _: Int => println("int")
}
}
Run Code Online (Sandbox Code Playgroud)
我可以接近Either,但它有两种以上的快速变得难看:
type or[L,R] = Either[L,R]
implicit def l2Or[L,R](l: L): L or R = Left(l)
implicit def r2Or[L,R](r: R): L or R = …Run Code Online (Sandbox Code Playgroud) 依赖方法类型以前曾是一个实验性功能,现在默认情况下已在中继中启用,显然这似乎在Scala社区中引起了一些兴奋.
初看起来,这并不是显而易见的.Heiko Seeberger在这里发布了一个简单的依赖方法类型示例,从评论中可以看出,可以很容易地在方法上使用类型参数进行复制.所以这不是一个非常引人注目的例子.(我可能会遗漏一些明显的东西.如果是这样,请纠正我.)
对于依赖方法类型的用例有哪些实用且有用的例子,它们明显优于替代方法?
我们可以用以前不可能/容易的事情做些什么有趣的事情?
他们通过现有的类型系统功能为我们买了什么?
此外,依赖方法类型是否类似于或从其他高级类型语言(如Haskell,OCaml)的类型系统中找到的任何功能中汲取灵感?
haskell type-systems programming-languages scala dependent-method-type
任何人都可以<:<在scala中提供有关运算符的一些细节.我认为:
if(apple <:< fruit) //checks if apple is a subclass of fruit.
Run Code Online (Sandbox Code Playgroud)
还有其他解释吗?我在scala源文件中看到了很多定义.
我看到Scala社区中有很多人建议避免像"瘟疫一样"进行分类.使用子类型的各种原因是什么?有哪些替代方案?
scala ×5
oop ×2
definition ×1
haskell ×1
liskov-substitution-principle ×1
scala-2.8 ×1
type-systems ×1