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

Scala:我如何使我的不可变类更容易子类化?

发布时间:2020-12-16 09:17:40 所属栏目:安全 来源:网络整理
导读:我最近创建了一个不可改变的类,支持类似的操作,等等,它在更改时返回该类的新实例. 我想要创建该类的子类来添加一些状态和功能,但现在我遇到一个问题,即所有原始类的方法都返回自身的实例而不是子类. 根据我目前对Scala的有限知识,我可以想出这一点: class F
我最近创建了一个不可改变的类,支持类似的操作,等等,它在更改时返回该类的新实例.

我想要创建该类的子类来添加一些状态和功能,但现在我遇到一个问题,即所有原始类的方法都返回自身的实例而不是子类.

根据我目前对Scala的有限知识,我可以想出这一点:

class Foo(val bar:Int) { 
  def copy(newBar:Int) = new Foo(newBar)
  def + (other:Foo):This = copy(this.bar + other.bar) 
}
class Subclass(barbar:Int) extends Foo(barbar) { 
  override def copy(newBar:Int) = new Subclass(newBar)
  override def + (other:Subclass) = super.+(other).asInstanceOf[Subclass]
}

这里的问题是相当明显的 – 返回新实例的超类的所有操作都必须在具有转换的子类中重新定义.

起初“this.type”似乎有希望,但是“this.type”只包含“this”,而不是任何其他相同类型的对象.

有没有一个标准的模式,使不可变类易于子类化?就像是:

class Foo(val bar:Int) { 
  def copy(newBar:Int):SameType = new Foo(newBar)
  def + (other:Foo) = copy(this.bar + other.bar) 
}
class Subclass(barbar:Int) extends Foo(barbar) { 
  override def copy(newBar:Int):SameType = new Subclass(newBar)
  override def + (other:Subclass) = super.+(other).asInstanceOf[Subclass]
}

这个特定的方法将需要编译器要求所有的子类实现一个copy()方法,该方法返回与该子类相同的类型,这对我来说完全正确.但是,我现在不认为Scala有这样的事情.

一些想到的工作是:

>使用委托 – 但是当然我仍然会将所有的方法重新实现为委托调用
>使用隐式类型来添加操作而不是子类化
>使用可变数据结构.这可能是最简单和最快速的解决方案,但是我将失去使用不可变数据结构的好处(我仍然希望了解更多信息).

我相信这已经很多次了,我再次道歉.我没有成功地重复了Google,所以我的搜索字词一直很差.

提前致谢,

Dobes

解决方法

您可以使用实现特征,如集合类做的,由具体类型参数化.例如:

trait FooLike[+A] {
  protected def bar: Int

  protected def copy(newBar: Int): A
  def +(other: Foo): A = copy(bar + other.bar)
}

class Foo(val bar: Int) extends FooLike[Foo] {
  protected def copy(newBar: Int): Foo = new Foo(newBar)
}

class Subclass(barbar: Int) extends Foo(barbar) with FooLike[Subclass] {
  protected def copy(newBar: Int): Subclass = new Subclass(newBar)
}

(编辑:李大同)

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

    推荐文章
      热点阅读