如果有的话,面向对象编程(OOP)子类型化相对于类型类有哪些优势?换句话说,既然我们有了类型类,是否仍有理由使用面向对象编程(OOP)子类型化呢?
PS:我是Scala程序员。
如果有的话,面向对象编程(OOP)子类型化相对于类型类有哪些优势?换句话说,既然我们有了类型类,是否仍有理由使用面向对象编程(OOP)子类型化呢?
PS:我是Scala程序员。
目前,Scala类型类的语法开销比通过特质继承进行子类型化要大得多,潜在的运行时开销也是如此。想象一种情况,您需要让五十种不同类型的事件符合一个接口以支持事件处理引擎。这时使用特质继承会更加容易。
class MyEvent extends Event{
val name = "foo"
}
than
class MyEvent{
val name = "foo"
}
object MyEvent2Event{
implicit def convert(myEvent:MyEvent) = new Event{ val name = myEvent.name}
}
trait Locking{
private val lock = new ReentrantReadWriteLock()
def withReadLock[T](body: => T):T={
try{
lock.readLock.lock()
body
}finally{
lock.readLock.unlock()
}
}
// same for withWriteLock
}
使用混合继承的方法非常方便,而且Scala类型类并不能很好地实现它,因为存在“lock”val。那应该把它放在哪里呢?如果将其放在适配的类中,则会失去大部分特质的封装价值。如果将其放在适配器代码中,则锁不再保护任何内容,因为每次适配时都会锁定不同的锁对象。
1请参阅Bruno C.d.S. Oliveira、Adriaan Moors和Martin Odersky的文章Type Classes as Objects and Implicits,以及关于该论文的讨论Lambda the Ultimate,特别是Paul Snively的这篇精彩摘要(强调添加):
Martin Odersky和他的团队在如何在一个统一的面向对象和函数式编程语言中实现类型类方面做出的设计决策仍然产生着有趣的成果。在我看来,随着对这篇论文的快速阅读,隐式转换看起来越来越不像“穷人版的类型类”,而更像是类型类的一种改进。