oop - 子类型优于类型类的优点

标签 oop scala programming-languages haskell functional-programming

与类型类相比,OOP 子类型化有哪些优势(如果有的话)?换句话说,既然我们有了类型类,还有什么理由继续使用 OOP 子类型?

PS:我是一名 Scala 程序员。

最佳答案

目前,Scala 类型类的语法开销比通过 trait 继承进行子类型化要大很多,潜在的运行时开销也是如此。想象一个案例,你需要有五十种不同类型的事件符合一个接口(interface)来支持一个事件处理引擎。写起来容易得多

class MyEvent extends Event{
  val name = "foo"
}


class MyEvent{
   val name = "foo"
}

object MyEvent2Event{
   implicit def convert(myEvent:MyEvent) = new Event{ val name = myEvent.name}
}

第二种形式在事后多态性、命名自由和一般的坏话方面提供了更大的灵 active ,但是输入这 50 种转换方法,然后在需要类型类时进行适当的导入将成为一个正确的痛苦。如果您不需要灵 active ,则很难看到返回。另外,第二个中还有那个烦人的“new”关键字,它会产生无休止的“这是否过度强调了垃圾收集器”的论点。

对于引入可变状态的 mixin 继承,情况更糟。考虑以下特征,取自生产代码:
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
}

由于“锁”val 的存在,mixin 继承的使用非常方便,但对于 Scala 类型类并不真正可行。它应该去哪里?如果你把它放在适配的类中,你就会失去大部分 trait 的封装值(value)。如果你把它放在适配器代码中,锁不再保护任何东西,因为你每次适应时都会锁定不同的锁对象。

关于oop - 子类型优于类型类的优点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3848492/

相关文章:

c# - 创建对象的最佳方式

mysql - [运行时异常 : SqlMappingError(No rows when expecting a single one)]

scala - 如何访问InputDStream数据?

programming-languages - 除 C++ 外,哪些编程语言支持运算符重载?

python - 为什么 Python 比 Ruby 快?

java - 使用 Actors 而不是 `synchronized`

python - 在不知道正确的派生类的情况下创建派生类的实例

python-3.x - 使用 pytest 对包含某个类的实例的某个函数进行单元测试

oop - Go中方法参数的继承替代

java - 作为一个称职的 scala 程序员是否需要你成为一个称职的 java 程序员?