加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala:抽象类构造函数参数vs Trait val成员?

发布时间:2020-12-16 18:52:14 所属栏目:安全 来源:网络整理
导读:我注意到有几个关于如何在抽象类和特征之间进行选择的讨论,但似乎没有一个关注于以下几点.让我使用抽象类的一个原因是,它们可以有构造函数参数,而特征却不能.但为什么不是以下 trait X { def haha: Int}class Y(val haha: Int) extends X 甚至不需要早期定义
我注意到有几个关于如何在抽象类和特征之间进行选择的讨论,但似乎没有一个关注于以下几点.让我使用抽象类的一个原因是,它们可以有构造函数参数,而特征却不能.但为什么不是以下

trait X {
  def haha: Int
}
class Y(val haha: Int) extends X

甚至不需要早期定义来使一切正常工作(我担心).抽象类版本是

abstract class X(haha: Int)
class Y(val haha: Int) extends X(haha)

而且我不喜欢抽象类版本,因为当你多次扩展时,这些构造函数参数出现在任何地方(也许有人告诉我如何避免这种情况?).

我知道抽象类可以更好地插入Java,并且更符合“is-a”概念.尽管如此,我是否有理由在某处使用抽象类?谢谢!

解决方法

class参数不必是成员(field或def).

abstract class X(haha: Int) {
  val hoho = 2 * haha  // compile-time constant
}

类似地,特征初始化顺序取决于线性化(混合顺序),这就是特征成员应该是defs而不是vals的原因. (并且你总是可以用val覆盖def.)使用抽象类,你知道你的超级用户是谁,并且你正在为子类定义扩展点.

但是请注意你的抽象类在错误的地方有val:

abstract class X(val haha: Int)
class Y(haha: Int) extends X(haha)

也就是说,你会期望X决定param是否是val(并且不一定是).在X或Y中使用参数可以将其转换为字段.

你对类的值参数的观察也适用于类型参数:在层次结构中传递Foo [A]是多么令人讨厌.所以在Scala中,我们可以有一个成员类型A,它可以保持抽象,直到在叶子中定义.但这实际上并不取决于是否定义特征或类.

但特征参数正在向Scala发展. (有关早期定义的Scala错误,由于这个原因,这些错误是低优先级的.)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读