Переопределение метода по типу возвращаемого значения в scala, oop solution? - PullRequest
3 голосов
/ 30 ноября 2011

У меня есть какая-то проблема, чтобы найти информацию о моей проблеме в scala, peraphs, вы можете помочь мне найти хорошее решение, или хорошие веб / книжные ресурсы?

У меня есть один основной абстрактный класс Operator:

abstract class Operator[G <: AbstractGenome, F <: GenomeFactory[G]] {
  implicit val factory: F
  def operate (genomes: IndexedSeq[G])
}

и два других унаследованных абстрактных класса:

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]
  }

Моя проблема здесь, я не могу переопределитьМетод работать (..) с другим типом возвращаемого значения, когда я пытаюсь инстанцировать этот абстрактный класс, этот код не работает.

У меня уже есть несколько строк кода, которые используют метод мутации opera (), который возвращает уникальный геном G ... Могу ли я сохранить эту структуру ООП, используя оболочку, промежуточный объект для захвата моего генома, иОбойти эту проблему также с общей структурой?

Большое спасибо за ваши огни, SR.

1 Ответ

3 голосов
/ 30 ноября 2011

Если вы не предоставляете тип возврата для абстрактного метода, используется Unit, а не Any, как вы могли предположить.Просто измените объявление в Operator на

def operate(genomes: IndexedSeq[G]): Any

Это не будет работать во втором случае, поскольку вы не можете добавлять списки параметров при переопределении методов.Вам нужно будет предоставить неявный параметр через конструктор или добавить его в объявление в базовом классе.

Самый простой способ реализовать это - добавить параметр типа для возвращаемого типа в Operation ипоместите неявные параметры, необходимые для конкретного экземпляра, в конструктор вашей реализации, например

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]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...