2011-11-30 3 views
3

나는 스칼라에서 나의 문제에 관한 정보를 찾을 수있는 몇 가지 문제가있다. 좋은 해결책을 찾는데 도움이 될 수있는 peraphs 나 좋은 웹/책 ressources를 찾을 수 있는가?스칼라의 반환 유형에 의한 메서드 재정의, oop 솔루션?

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

두 개의 다른 상속 추상 클래스 :

나는 하나 개의 주요 추상 클래스 Operator

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

내 문제는 다른과 (..) 나는 방법이 작동 무시할 수 없습니다, 여기 반환 형식이 추상 클래스를 instancite하려고하면이 코드는 작동하지 않습니다.

고유 한 게놈 G를 반환하는 변이 조작() 메서드를 사용하는 코드가 이미 여러 줄 ... 래퍼, 중간 개체를 사용하여이 게놈 구조를 보존 할 수 있습니까? 또한 일반적인 구조에 문제가 있습니까?

조명에 감사드립니다. SR.

답변

3

추상적 인 메소드에 반환 유형을 제공하지 않으면 Unit이 사용됩니다 (가정 할 때 Any이 아님). 메소드를 오버라이드 (override) 할 때 매개 변수 목록을 추가 할 수 없습니다로하지만 그냥

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

이 두 번째 경우에 작동하지 않습니다에 Operator의 선언을 변경합니다. 생성자를 통해 암시 적 매개 변수를 제공하거나 기본 클래스의 선언에 추가해야합니다.

이것을 구현하는 가장 쉬운 방법은 반환 유형에 대한 유형 매개 변수를 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]]