gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 11:17:46 25 4
gpt4 key购买 nike

与类型类相比,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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com