2012-02-20 3 views
2

Учитывая любую Карту, я хотел бы иметь возможность получить следующую и предыдущую Карты, если они существуют. Идея с функциями next() и prev() состоит в том, что они возвращают следующие или предыдущие Копии соответственно. Порядок костюмов быть: Сердца, Лопаты, бубны, трефы Для получения дополнительных разъяснений, я должен сделать эту // случай класс карты (п: Int, с: костюм)Scala abstract case class

// 1. определить абстрактный случай класс костюм

// 2. определить абстрактные примеры классов RedSuit и BlackSuit

// 3. определить конкретные тематические классы сердца, пики, бубны, трефы

// 5. определять абстрактные методы следующего() : Костюм и prev(): Костюм на костюмный костюм

// 6. Внедрение следующего(): Сюита и prev(): Костюм на каждом из классов «Сердца, бриллианты, лопаты и клубы»

// 7. Внедрение следующей(): Карты и prev() : карта на класс карты

Но в первую очередь я не могу реализовать следующий() на сердец класса

case class Card(n: Int, s: Suit) 

abstract case class Suit{ 
    type cardsuit <: Suit 


    def next(): cardsuit 
    def prev(): cardsuit 


} 
abstract case class RedSuit extends Suit{ 
    type red <: RedSuit 


} 
abstract case class BlackSuit extends Suit{ 
    type black <: BlackSuit 


} 
case class Hearts extends RedSuit{ 

    type red = Hearts 

    def next()= // I wanna have Spades hier 
    def prev()= // I wanna have Clubs hier 
} 
+2

У вас никогда не должно быть абстрактных классов случаев. –

+3

Можете ли вы объяснить, почему наследование классов классов так плохо? – tuxSlayer

ответ

8

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

Что касается моделирования ваших костюмов, как насчет чего-то подобного?

trait Suit { 
    type ThisSuit <: Suit 
    type PrevSuit <: Suit 
    type NextSuit <: Suit 

    def prev: PrevSuit 
    def next: NextSuit 
} 

trait RedSuit extends Suit { 
    type ThisSuit <: RedSuit 
} 
trait BlackSuit extends Suit { 
    type ThisSuit <: BlackSuit 
} 

case object Hearts extends RedSuit { 
    type ThisSuit = Hearts.type 
    type PrevSuit = Nothing 
    type NextSuit = Spades.type 
    def prev = throw new NoSuchElementException 
    def next = Spades 
} 
case object Spades extends BlackSuit { 
    type ThisSuit = Spades.type 
    type PrevSuit = Hearts.type 
    type NextSuit = Diamonds.type 
    def prev = Hearts 
    def next = Diamonds 
} 
case object Diamonds extends RedSuit { 
    type ThisSuit = Diamonds.type 
    type PrevSuit = Spades.type 
    type NextSuit = Clubs.type 
    def prev = Spades 
    def next = Clubs 
} 
case object Clubs extends BlackSuit { 
    type ThisSuit = Clubs.type 
    type PrevSuit = Diamonds.type 
    type NextSuit = Nothing 
    def prev = Diamonds 
    def next = throw new NoSuchElementException 
} 

Вы можете prev и next вернуть Option[PrevSuit] и Option[NextSuit], соответственно, а не бросать исключения; или сделать костюмы обернутыми между Сердцами и Клубами.

+0

Дает ошибку (тип несоответствие в шкафу сердца) найдено: Spades.type (с базовым типом объекта) требуется: Hearts.PrevSuit def next = Spades – Saar

+4

@Saar - используйте ': paste' перед вставкой в ​​REPL , поскольку между классами существуют круговые зависимости. – leedm777