首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在scala中通过返回类型重写方法,oop解决方案?

在scala中通过返回类型重写方法,oop解决方案?
EN

Stack Overflow用户
提问于 2011-11-30 22:18:42
回答 1查看 1.6K关注 0票数 3

我在scala中找到关于我的问题的oop信息时遇到了一些问题,你能帮我找到一个好的解决方案吗,或者是好的web/书籍资源?

我有一个主要的抽象类Operator

代码语言:javascript
复制
abstract class Operator[G <: AbstractGenome, F <: GenomeFactory[G]] {
  implicit val factory: F
  def operate (genomes: IndexedSeq[G])
}

和另外两个继承的抽象类:

代码语言:javascript
复制
abstract class Mutation [G <: AbstractGenome, F <: GenomeFactory [G]]  
  extends Operator [G, F] {
  override def operate (genomes: IndexedSeq[G]):G
}

abstract class CrossOver [G <: AbstractGenome, F <: GenomeFactory [G]]
  extends Operator [G, F] {
  override def operate (genomes: IndexedSeq[G]) (implicit aprng : Random):IndexedSeq[G]
  }

我的问题在这里,我不能重写方法operate(..)当我尝试实例化这些抽象类时,使用不同的返回类型,此代码不起作用。

我已经有了多行代码,这些代码使用突变操作()方法返回一个唯一的基因组G…我可以通过使用包装器来保存这种OOP结构吗?包装器是捕获我的基因组的中间对象,并使用泛型结构绕过这个问题?

谢谢你的灯光,SR。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-11-30 22:27:38

如果您没有为抽象方法提供返回类型,则会使用Unit,而不是您可能假设的Any。只需将Operator中的声明更改为

代码语言:javascript
复制
def operate(genomes: IndexedSeq[G]): Any

这在第二种情况下不会起作用,因为你不能在覆盖方法时添加参数列表。您必须通过构造函数提供隐式参数,或者将其添加到基类的声明中。

实现这一点的最简单方法是将返回类型的类型参数添加到Operation中,并将特定实例所需的隐式参数放入实现的构造函数中,例如

代码语言:javascript
复制
abstract class Operator[G <: AbstractGenome, F <: GenomeFactory[G], R] {
  implicit val factory: F
  def operate (genomes: IndexedSeq[G]): R
}

class CrossOver[G <: AbstractGenome, F <: GenomeFactory [G]](implicit r: Random)
  extends Operator [G, F, IndexedSeq[G]]
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8327328

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档